[讨论]nokia S60用cmwap连接网络,好像经常数据被移动替换了

Line-Tang 2007-08-10 11:45:13
用S60机,cmwap做连接点,连接网络,经常数据被截取,
如open一个http连接,得到的数据跟发送的 http页面的数据完全不同,好像被移动给替换掉了
以前的时候只有第一次连接网络的时候,移动会发一个提示连接网络的消息,会把第一次的数据给替换掉
现在好像会随即的替换调。
不知道有谁遇到问题?
s40机,好像没有遇到过?
...全文
1118 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
sentiment 2007-09-09
  • 打赏
  • 举报
回复
我也是第一次连接得到的数据不对,以后就正常了,到底是什么原因了.我的第一个页面应当返回的内容(不包括头)是2312字节,可是cmwap第一次返回给我了才2014字节,整整差了好多,我现在怎么弄都是这样,到底是怎么回事了,请高手指教下
zitengxin 2007-08-24
  • 打赏
  • 举报
回复
启动一个连接后
第一次连网关会返回一个移动的确认信息
就是问你是不是继续访问之类的,这个是移动今年刚加进去的
之后的连接就会正常了
但是这个接入点端口后重新连接又会出来这个东西的
而且每个省可能都会不同
你说测试了一天问题没了可能是因为有其他程序已经打开了连接
而你刚好是用那个连接,那当然是不会再出现了
Line-Tang 2007-08-17
  • 打赏
  • 举报
回复
唉!毫无头绪啊!把代码贴出来,大家帮忙看看


import javax.microedition.io.ConnectionNotFoundException;
import javax.microedition.io.HttpConnection;
import javax.microedition.io.Connector;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.Thread;



public class HttpThread extends Thread{

private final static int MAX_LENGTH = 20 * 1024; // 20K
private final static String ENC ="UTF-8";
public final static String USER_AGENT = "Profile/MIDP-2.0 Configuration/CLDC-1.1";

private boolean cancel = false;

private String type = null;

private boolean finish = false;

private short id = 0;

private String method = "GET";//请求的方式
private String URL = null;//连接的URL
private byte[] data = null;//要发送的数据

public HttpThread(short id,String URL,String method) {
this.id = id;
this.URL = URL;
this.method = method;

cancel = false;
finish = false;
type = null;

this.setPriority(Thread.MIN_PRIORITY);
}

public void cancel() {
cancel = true;
}

void setId(short id) {
this.id = id;
}

short getId() {
return id;
}

public void run() {
try {
finish = false;
connect();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
finish = true;
}
}

public boolean isFinish() {
return finish;
}

/**
* 功能描述:打开HttpConnection,发送和接收数据
*
* @throws IOException
*/
private void connect() throws IOException {
HttpConnection conn = null;
InputStream input = null;
DataOutputStream dos = null;

int code = 9999;
try {
// 打开一个http连接
//conn.setRequestProperty("X-Online-Host", "bruddy.vicp.net");
if (getMethod().equals(HttpConnection.POST)) {
conn = (HttpConnection) Connector.open(getURL(),Connector.READ_WRITE,true);

// 如果要放送的消息message不为空,且method为POST,发送消息
if (getData() != null) {
conn.setRequestMethod(HttpConnection.POST); // 默认即为GET
conn.setRequestProperty("User-Agent", USER_AGENT);
conn.setRequestProperty("Content-Encoding", ENC);
//键值对发送
conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
conn.setRequestProperty("Content-length", Integer.toString(getData().length));
dos = conn.openDataOutputStream();
dos.write(getData());
dos.flush();
if (dos != null) {
dos.close();
dos = null;
}
}
}else{
conn = (HttpConnection) Connector.open(getURL(),Connector.READ,false);
}
code = conn.getResponseCode();// 得到响应码!这里可能会阻塞:
if (code == HttpConnection.HTTP_OK) {// 200--成功
logResponseHead(conn);
type = conn.getType();
if (onProcessType(type)) {
// get size:
int size = (int) conn.getLength(); // 返回响应大小,或者-1如果大小无法确定
input = conn.openInputStream();
// 接收数据
receiveData(input, size);
}
} else if (code == HttpConnection.HTTP_MOVED_TEMP) {// 302-重定向
// URL = "重定向地址" conn.getHeaderField("location")
connect();
} else {// 其他错误代码
processError(code,conn);
}
} catch (IllegalArgumentException iaex) {
String error = "非法URL.";
onError(95, error);
} catch (ConnectionNotFoundException cnex) {
String error = "不能够找到连接.";
onError(96, error);
} catch (IOException ex) {
ex.printStackTrace();
//String error = "[" + testCode + "]" + ex.getMessage() + " [io异常]";
String error = "连接超时,请重试!";
onError(97, error);
} catch (SecurityException secEx) {
String error = "安全限制,不能够访问网络.";
onError(98, error);
} finally { // 清理资源
if (dos != null) {
dos.close();
dos = null;
}
if (input != null) {
input.close();
input = null;
}
if (conn != null) {
conn.close();
conn = null;
}
}
}

/**
* 功能描述:从input中读取size个字节的数据
*
* @param input
* @param size
* @throws IOException
*/
private void receiveData(InputStream input, int size) throws IOException {
int pos = 0; // 目前读取到的位置
int reads; // 每次读取的byte数
byte[] buffer = null;
if (size != (-1))
buffer = new byte[size]; // 响应大小已知,确定缓冲区大小
else
buffer = new byte[MAX_LENGTH]; // 响应大小未知,设定一个固定大小的缓冲区

while (!cancel) {
int len = buffer.length - pos;// 未读取的字节数
len = len > 128 ? 128 : len;// 每次可读取的字节数
if (len <= 0)
break;
reads = input.read(buffer, pos, len);
if (reads <= 0)
break;
pos += reads;
}

if (!cancel) {
if (size != (-1) && pos != size)
onError(102,"Content-Length does not match.");
else
onFinish(buffer,getURL(), type);
}
}

/**
* 功能描述:打印回应的头信息
*
* @param con
* @throws IOException
*/
void logResponseHead(HttpConnection con) throws IOException {
String sHeader = "";
String value = "";
for (int i = 0;; i++) {
sHeader = con.getHeaderFieldKey(i);
value = con.getHeaderField(i);
if (sHeader != null) {
System.out.println(i + " , " + sHeader + " : " + value);
} else {
break;
}
}
}

void processError(int errCode,HttpConnection conn) throws IOException{
String err = "";
switch(errCode){
case 400:err ="错误请求.";break;
case 401:err ="未授权.";break;
case 402:err ="要求付费.";break;
case 403:err ="禁止.";break;
case 404:err ="未找到.";break;
case 405:err ="不允许的方法.";break;
case 406:err ="不被采纳.";break;
case 407:err ="要求代理授权.";break;
case 408:err ="请求超时.";break;
case 409:err ="冲突.";break;
case 410:err ="过期的.";break;
case 411:err ="要求的长度.";break;
case 412:err ="前提不成立.";break;
case 413:err ="请求实例太大.";break;
case 414:err ="请求URI太大.";break;
case 415:err ="不支持的媒体类型.";break;
case 416:err ="无法满足的请求范围.";break;
case 417:err ="失败的预期.";break;
case 500:err ="内部服务器错误.";break;
case 501:err ="未被使用.";break;
case 502:err ="网关错误.";break;
case 503:err ="不可用的服务.";break;
case 504:err ="网关超时.";break;
case 505:err ="HTTP版本未被支持.";break;
default:err = conn.getResponseMessage(); break;
}
onError(errCode,err);
}

//只处理那些类型
boolean onProcessType(String type){
return true;
}

//处理错误
void onError(int code,String err){

}

//处理收到的数据
void onFinish(byte [] buffer, String url, String type){

}
/**
* @return the method
*/
protected String getMethod() {
return method;
}

/**
* @param method the method to set
*/
protected void setMethod(String method) {
this.method = method;
}

/**
* @return the uRL
*/
protected String getURL() {
return URL;
}

/**
* @param url the uRL to set
*/
protected void setURL(String url) {
URL = url;
}

/**
* @return the date
*/
protected byte[] getData() {
return data;
}

/**
* @param date the date to set
*/
protected void setData(byte[] date) {
this.data = date;
}

}
Line-Tang 2007-08-17
  • 打赏
  • 举报
回复
今天测试了一天,以前的问题好像不存在了,太搞笑了吧!不知道明天测试有会怎么样?
Line-Tang 2007-08-14
  • 打赏
  • 举报
回复
采用GET方式连接,头里没有设置任何东西。
dongdong715 2007-08-14
  • 打赏
  • 举报
回复
LZ把代码帖出来看看。
dongdong715 2007-08-14
  • 打赏
  • 举报
回复
有没在请求头设置特殊的东西呢?
dongdong715 2007-08-13
  • 打赏
  • 举报
回复
你看看你的服务端,究竟有没有收到客户端的请求并做出了相应业务逻辑的输出.
Line-Tang 2007-08-13
  • 打赏
  • 举报
回复
WML计费的不是上面那个。计费的页面是这样的:
0,data:Mon,13 Aug 2007 02:50:29 GMT
1,server:WebLogic Server 8.1 SP3 Tue Jun 29 23:11:19 PDT 2004 404973 with CRs:
2,content-length:549
3,content-type:text/vnd.wap.wml;charset=utf-8
<?xml version="1.0"/>
<>
<wml>
<head>
<meta http-equiv="Cache-Control" content="max-age=0" forua="true"/>
<meta http-equiv="Cache-Control" content="no-cache" forua="true"/>
<meta http-equiv="Cache-Control" content="must-revalidate" forua="true"/>
</head>
<card id="card" title="">
<onevent type=="onenterforward">
<go href="http://..(这里省略,为我访问的地址)&t=29224">
</go>
</onevent>
</card>
</wml>

另外:wormwormwormworm(吃老板的嘴软,拿老板的手软)说 "包体不会被修改",我肯定是被修改了。而且整个包被替换了。
Line-Tang 2007-08-13
  • 打赏
  • 举报
回复
试着用http连百度 http://wap.baidu.com
出错的时候会得到这样的结果:
头:
0.cache-control:no-cahce
1,connection:keep-Alive
2,data:Mon,13 Aug 2007 07:10:37 GMT
3.keep-alive:timtout=30,max=50
4,age:0
5,set-cookie:JSESSIONID=64234CA4206BC9DBECD874927D1817EC;Path=/jsp
6,content-length:2735
7,content-type:application/wnd.wap.wmlc;utf-8
8,expires:-1
9,proxy-connection:Keep-Alive
10,x-pad:avoid brower bug
头中content-length:2735长度为 2735,但是好像没有收到数据

下面是服务器上收到的头消息:
成功时:
host:(我的服务器);
content-length:0;
via:WTP/1.1 GDSZ-PS-GW011-WAP03.gd.chinamobile.com (Nokia WAP Gateway 4.0/CD3/4.1.79);
x-forwarded-for:10.103.103.121;
x-source-id:SZGGSN01BNK;
x-nokia-connection_mode:TCP;
x-up-bearer-type:GPRS;
x-nokia-gateway-id:NWG/4.1/Build04;
accept:*/*;
cookie:JSESSIONID=58FE15AC5353B605B49143DE7AA3325C;;
connection:keep-alive;

不成功时:
connection:Keep-Alive;
host:(我的服务器);
accept:*/*;
accept-charset:utf-8, iso-8859-1;
accept-language:en, zh-cn;
via:(infoX WAP Gateway), HTTP/1.1, Huawei Technologies;
x-huawei-nasip:211.139.189.153;

不知道从这些头里面能够看到什么有用的消息?
Line-Tang 2007-08-13
  • 打赏
  • 举报
回复
--“你看看你的服务端,究竟有没有收到客户端的请求并做出了相应业务逻辑的输出.”
服务器收到了客服端的请求,并且做出了响应。
没有用CMNET测试过。
有谁见过x-sp-result这个头标志么?要知道这个是什么意思就好了
xueyong1203 2007-08-13
  • 打赏
  • 举报
回复
我也碰到了类似的问题, 不过我二次连接就OK了
服务器是c#的
第一次联网时, 整个包体会被替换成188个字节, 仅当CMWAP HTTP时
CMNET一切正常
dongdong715 2007-08-12
  • 打赏
  • 举报
回复
一样走的是WAP网关,肯定关梦网的事.
content-type:application/vnd.wap.wmlc,charset=utf-8

根据你收到这响应 我怀疑是返回了移动的WML计费页面,你可以把收到的页面打印出来看看。
wormwormwormworm 2007-08-12
  • 打赏
  • 举报
回复
包体不会被修改
Line-Tang 2007-08-11
  • 打赏
  • 举报
回复
有做了一些测试:
收到一些奇怪的头:
0,connection:Keep-Alive
1,data:Sta,11 Aug 2007 06:56:32 GMT
2,keep-alive:timeout=30,max=50
3,server:WebLogic Server 8.1 SP3 Tue Jun 29 23:11:19 PDT 2004 404973 with CRs:
4,set-cookie:Jid=G9dgbMDYcx!592313396!129346633;path=/
5,content-length:200
6,content-type:application/vnd.wap.wmlc,charset=utf-8
7,proy-connection:Keep-Alive

如果在继续连接一次网络,会收到以下的头消息,内容是乱码:
0,connection:close
1,content-length:68
2,content-type:application/vnd.wap.wmlc
3,x-sp-result:704

关键是想知道x-sp-result:704这个的意思?

目前正在申请SP....
Line-Tang 2007-08-11
  • 打赏
  • 举报
回复
楼上的说:"移动WAP的约束"---那里有相关的详细资料。
另外,我这个http服务器上的wap站点目前不是“移动梦网”的业务,移动是不是做了相关限制。但是,奇怪的是在nokia s40机上不存在这个问题,s60上有时候有,有时候没有?做了几天测试,我想应该是移动网关的原因。
dongdong715 2007-08-11
  • 打赏
  • 举报
回复
HTTP头的修改不修改得看具体省份和地市所用的网关,像广州NOKIA硬件的网关就不会去修改J2ME的HTTP请求头,但是有些省份的华为硬件的网关就会修改HTTP的请求头,当然这也不排除完全不关网关事的可能,也可能是移动内部可配置的。
 像楼主说的这些问题,可尽量参考一些移动关于WAP的约束.
yanhan0615 2007-08-10
  • 打赏
  • 举报
回复
确实HTTP请求在过移动网关的时候是会修改头数据,但是包体不会被修改,所以,如果有什么不想被修改的内容放到包体中!
Line-Tang 2007-08-10
  • 打赏
  • 举报
回复
做了好多测试,毫无头绪。
发现http头中包含以下字段:
0,connection:close
1,content-length:68
2,content-type:application/vnd.wap.wmlc
3,x-sp-result:704
内容是一些乱码,不知道移动用了什么编码?
---方正这些数据跟服务器发送出来的数据完全不同,被移动替换了
查了下x-sp-result:704,没有看到相关的消息
能否从 移动 那里得到相关信息。

13,100

社区成员

发帖
与我相关
我的任务
社区描述
Java J2ME
社区管理员
  • J2ME社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧