.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类型

 

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

导读:   .net服务器向j2me客户端发送字节流,在穿过cmwap网关时字节流的内容发生变化,为什么?   我用.net+aspx写了一个简单的测试的例子,用于向客户端发送一串字节流,代码如下:...
  • yingfox
  • yingfox
  • 2007年11月02日 12:24
  • 384

socket通信中字节流、字符流区别 续

写数据 import java.io.File;  import java.io.FileOutputStream;  .import java.io.IOException;  imp...
  • u013182960
  • u013182960
  • 2017年07月18日 15:15
  • 346

PHP使用Socket发送字节流

例如,需要发送以下数据 struct header { int type; // 消息类型 int length; // 消息长度 } struct MSG_Q2R2DB_PAYRESULT {...
  • moqiang02
  • moqiang02
  • 2014年03月18日 00:33
  • 2402

为什么说TCP报文段是面向字节流的,UDP包是面向数据报的

为什么说TCP报文段是面向字节流的,UDP包是面向数据报的? 面向报文的传输方式是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。若报文太...
  • bian_qing_quan11
  • bian_qing_quan11
  • 2017年08月30日 21:10
  • 656

Python字节流打包拆包

Python提供了一个struct模块用于打包拆包 -----------------------------------------------------------------------...
  • xmnathan
  • xmnathan
  • 2011年11月30日 11:28
  • 9727

Servlet-字节流

package lzh.servlettest; import java.io.IOException; import java.util.Date; import javax.servlet.S...
  • lzhat
  • lzhat
  • 2016年11月01日 17:44
  • 392

字节流之向文件中写入字符串并读出字符串

1、InputStream(输入字节流) InputStream是一个定义了Java流式字节输入模式的抽象类,该类的所有方法在出错时都会引发一个IOExceptin异常。           方法...
  • u010016150
  • u010016150
  • 2015年01月22日 16:19
  • 1697

Java基础回顾 : 利用字节流实现文件的拷贝

本文是一个范例 : 利用字节流实现文件的拷贝 package example; /** * 文件的拷贝. */ import java.io.File; import java.io.FileI...
  • sinat_18882775
  • sinat_18882775
  • 2016年05月29日 23:37
  • 2870

C# 二进制字节流读写封装

完成以下功能: 只针对内存字节流的读写,主要应用于数据的解析和写入。提供不同数据类型的读写接口,包括byte,short,int,float,string等。处理了大小端数据转换的问题,所以...
  • tom_221x
  • tom_221x
  • 2017年05月16日 19:41
  • 1079

socket通信中字节流、字符流区别

先来看一下流的概念: 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。 程序中的输入输出都是以流...
  • XiangTianZaiJie500
  • XiangTianZaiJie500
  • 2016年07月30日 08:34
  • 4386
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:.net服务器向j2me客户端发送字节流,在穿过cmwap网­关时字节流的内容发生变化,为什么?
举报原因:
原因补充:

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