.net服务器向j2me客户端发送字节流,在穿过cmwap网­关时字节流的内容发生变化,为什么?

转载 2007年09月17日 09:54:00
.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类型

 

相关文章推荐

j2me Socket编程常用服务器和客户端编写结构

程序比较乱,望能给予参考。更复杂的写法,自己开发 服务器端代码: public class SocketServer1 extends MIDlet {  private ServerSoc...

Java IO字符流和字节流

  • 2012年04月28日 08:36
  • 51KB
  • 下载

J2ME的移动支付系统的客户端的实现

J2ME的移动支付系统的客户端的实现整个J2ME客户端的逻辑架构是由若干个功能模块组成的,这些功能模块覆盖了网络通信、用户界面、安全等各个方面的职能,并通过模块间的通信共同实现了移动支付系统客户端的功...
  • cnlht
  • cnlht
  • 2011年02月26日 15:37
  • 1376

java 字节流

  • 2013年09月25日 10:52
  • 2KB
  • 下载

得到字节流

  • 2017年08月29日 10:35
  • 701B
  • 下载

andy学java系列之J2ME的移动支付系统的客户端的实现

J2ME的移动支付系统的客户端的实现整个J2ME客户端的逻辑架构是由若干个功能模块组成的,这些功能模块覆盖了网络通信、用户界面、安全等各个方面的职能,并通过模块间的通信共同实现了移动支付系统客户端的功...

Java学习IO流小结--字节流

  • 2015年07月11日 14:59
  • 218KB
  • 下载

Java字符流和字节流

  • 2016年03月09日 16:41
  • 60KB
  • 下载

在J2ME中使用Socket通过cmwap接入点访问安全HTTPS

这个问题是在我升级J2ME版XHTML浏览器的时候被引入的,我尝试了很多方法、发了很多帖子、问了很多人都没有找到可行的解决方案。最后我在PC上通用OTA连接方式使用WireShark拦截数据包才解决了...
  • jinhill
  • jinhill
  • 2011年02月07日 21:20
  • 1383
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:.net服务器向j2me客户端发送字节流,在穿过cmwap网­关时字节流的内容发生变化,为什么?
举报原因:
原因补充:

(最多只允许输入30个字)