分享

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

 古罗 2007-09-17
.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类型

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多