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

导读:
  .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
  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类型
  Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1543796
  [收藏到我的网摘] [发送Trackback] 大河马发表于 2007年03月28日 12:00:00

本文转自
http://blog.csdn.net/xueyong1203/archive/2007/03/28/1543796.aspx
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值