.net服务器向j2me客户端发送字节流,在穿过cmwap网­关时字节流的内容发生变化,为什么?
2007-09-17 09:54
288 查看
.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+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网-关时字节流的内容发生变化,为什么?
- svn服务器发生变化,如何将当前svn客户端切换到新的svn位置
- 解决连接vcenter (客户端无法向服务器发送完整的请求。(基础连接已经关闭:发送时发生错误。)) 问题
- 客户端程序利用数据输出流out,将文本框中的内容发送给服务器
- 以post方式携窗体等参数向服务器发送请求 发出去的字节流 返回的内容
- 客户端C和服务器S之间建立一个TCP连接,该连接总是以1KB的最大段长发送TCP段,客户端C有足够的数据要发送。当拥塞窗口为16KB的时候发生超时,如果接下来的4个RTT往返时间内的TCP段的传输是成
- java socket发送十六进制字节内容发生变化的问题解决
- Redis服务器如何发送回复内容给客户端
- java实现客户端向服务器发送文件的操作
- ServerSocket和Socket建立通信(服务器和客户端循环接收发送)
- .net 服务器事件和客户端js事件的执行顺序
- 在J2ME客户端连续100次建立TCP连接并发送数据
- 关于客户端向服务器发送请求的加密问题
- TCP数据传输(四):上传文件操作(将客户端的文件发送到服务器)
- Windows Server 2003 使用vSphere5.5连接ESXI5.5 “客户端无法向服务器发送完整的请求” 的解决办法
- 客户端将手机号发送给服务器,服务器将包含该手机号文件名发送给客户端
- android客户端向服务器发送图片和文字,类似于发微博。能用json格式发送吗?
- 在为WINDOWS客户端读取共享列表时发生如下错误.错误2114:没启动服务器服务
- 服务端接收到客户端发送的文件名,并把文件的内容返回给客户端
- Centos 6.5 服务器下面配置邮件客户端 发送报警邮件