.net服务器向j2me客户端发送字节流,在穿过cmwap网关时字节流的内容发生变化,为什么?
我用.net+aspx写了一个简单的测试的例子,用于向客户端发送一串字节流,代码如下: string str = "255,93,145,189,93,0,0,0,133,0,93,145,189,93,0,2,0,34,91,49"; string[] sss=str.Split(','); byte[] bb = new byte[sss.Length]; for (int i = 0; i < sss.Length; i++) bb[i] = Convert.ToByte(sss[i]); Response.BinaryWrite(bb); Response.End(); 在.net服务器端字节流以无符号字节的形式发出,java客户端以带符号字节的形式进行接收。 如果在PC上用模拟器进行接收,则一切正常。 但是如果用nokia6600手机通过cmwap接入点访问这个服务,则得到的字节流会发生变化,客户端收到的字节流与服务端发出的不一样了,是谁改动了这串字节流?是cmwap网关吗? -------------------------------------------------------
服务器端以二进制流的形式发送以下内容: 255,93,145,189,93,0,0,0,133,0,93,145,189,93,0,2,0,34,91,49
PC模拟器收到以下内容:(注:客户端已带符号字节的形式接收) -1,93,-111,-67,98,0,0,0,-123,0,93,-111,-67,93,0,0,0,34,91,49 (OK,没有问题)
Nokia6600手机收到以下内容: -1,93,-111,-25,-88,-67,0,0,0,-123,0,93,-111,-25,-88,-67,0,2,0,34,91,49(服务器端发送的189,93两个字节被改变成了-25,-88,-67三个字节了。)
为了方便大家查看,我把三段内容排版在一起进行对比:
服务器:255 ,93,145,189,93 ,0 ,0,0 ,133 , 0 ,93,145 ,189 ,93 ,0 , 2 ,0 ,34, 91, 49 PC端: -1,93,-111,-67,98 ,0 ,0,0 ,-123, 0 ,93,-111, -67 ,93 ,0 , 0 ,0 ,34, 91, 49 手机: -1,93,-111,-25,-88,-67,0,0 , 0 ,-123,0 , 93 ,-111,-25,-88,-67,0 ,2 , 0 , 34 ,91,49 ----------------------------------------------------------------
问题解决了,在我在aspx的代码中加了一句: Response.AddHeader("Content-Type", "application/octet-stream"); 问题就解决了。
因此,我认为可能的原因是: 中国移动的网关会根据request或response中设置的Content-Type调整字节流中的内容; ----------------------------------------------------------------------
首先。你用.net和j2me 通信就是一个容易出问题的地方。win32和java本来就是不同的字节序。 要么你用 java-servlet,要么你用 java-nio。可以避免字节序的问题。 其次 cmwap网关不会修改你服务器的上行数据。它只是一个http-proxy而已。 不过它会修改你的服务器下行数据,设置UA或电话号码(该功能已经在去年中旬停止,如果你是SP是可以收到的)。但是CMWAP绝不会修改你的除http头以外的数据。 如果你系统后台已经是.net成型了。那么我建议你使用 J# 和j2me通信。可以直接避免该问题。需要注意的是,j#收到的数据反馈给同一进程中的其他语言所写的程序(如c#)时。你还是需要做一些转换工作。 -------------------------------------------------------------------------
以下是j2me使用Http通过cmwap网关连接服务器时的有效代码: /** * @todo HTTP连接 */ private HttpConnection conn = null; private void connect(String url, String port, int h) throws Exception, ConnectionNotFoundException { String url_ = "http://" + url + ":" + port; if (h == HTTP) { conn = (HttpConnection) Connector.open(url_, Connector.READ_WRITE, true); conn.setRequestProperty("User-Agent",
System.getProperty("microedition.profiles")); conn.setRequestProperty("Content-Type", "application/octet-stream"); conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestMethod(HttpConnection.POST); } else if (h == HTTP_AGENCY) { conn = (HttpConnection) Connector.open("http://10.0.0.172:80" + "/", Connector.READ_WRITE, true); conn.setRequestMethod(HttpConnection.POST); conn.setRequestProperty("X-Online-Host", url_); conn.setRequestProperty("User-Agent",
System.getProperty("microedition.profiles")); //conn.setRequestProperty("Connection", "close"); conn.setRequestProperty("Connection", "Keep-Alive"); // conn.setRequestProperty("Pragma", "no-cache"); conn.setRequestProperty("Content-Type", "application/octet-stream"); } }
注意这一句 conn.setRequestProperty("Content-Type", "application/octet-stream");
如果j2me 是这样写的。那么同样的,你的http服务器接收时,也要用同样的编码。否则可能text会有"\r\n"之类的协议数据。
另提醒一下,按我曾经做一年多的online mobi game srv的经验,真实网络环境和使用手机模拟器的PC-PC网络环境有非常大的差距,所以一定要以实测为准。 -----------------------------------------------------------------------
private HttpConnection conn = null; private void connect(String url, String port, int h) throws Exception, ConnectionNotFoundException { String url_ = "http://" + url + ":" + port; if (h == HTTP) { conn = (HttpConnection) Connector.open(url_, Connector.READ_WRITE, true); conn.setRequestProperty("User-Agent",
System.getProperty("microedition.profiles")); conn.setRequestProperty("Content-Type", "application/octet-stream"); conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestMethod(HttpConnection.POST); } else if (h == HTTP_AGENCY) { conn = (HttpConnection) Connector.open("http://10.0.0.172:80" + "/", Connector.READ_WRITE, true); conn.setRequestMethod(HttpConnection.POST); conn.setRequestProperty("X-Online-Host", url_); conn.setRequestProperty("User-Agent",
System.getProperty("microedition.profiles")); //conn.setRequestProperty("Connection", "close"); conn.setRequestProperty("Connection", "Keep-Alive"); // conn.setRequestProperty("Pragma", "no-cache"); conn.setRequestProperty("Content-Type", "application/octet-stream"); } }
这是j2me使用HTTP通过cmwap连接服务器的有效代码,注意conn.setRequestProperty("Content-Type", "application/octet-stream"); 服务端也需要使用相同的content类型
|