HTTP超时机制

kf156 2009-04-16 04:55:58
以下测试在6120c、N73上均如此:
在HTTP连接中,当我代码走CMWAP代理,而手机却设置为CMNET直连时,
打算在HTTP连接时,网络不通时改变连接方式为CMNET,真机上测试是OK的
主要问题就是网络不通时的等待时间长达两分四十秒左右。
具体测试如下:

1.代码走到int responseCode = http.getResponseCode();//HttpConnection http
发生阻塞,测了好多次,阻塞时间均为两分四十秒左右,之后抛出IO异常:-33。改变连接方式为CMNET,网络连接正常。

2.用Timer定时器并设置如果三十秒后,HTTP还是没返回,则运行TimerTask强制将http.close();http=null;
在手机上执行,代码依旧阻塞在http.getResponseCode();这句,三十秒后,TimerTask执行,却阻塞在http.close();这句
两分四十秒左右,抛出IO异常:-33。改变连接方式为CMNET,网络连接正常。

3.将TimerTask里的http.close()去掉,只剩下http=null;
在手机上执行,代码阻塞在http.getResponseCode();这句,三十秒后,TimerTask执行完毕,http被置null
但并未抛出任何异常,直到两分四十秒左右,依旧抛出IO异常:-33。改变连接方式为CMNET,网络连接正常。

有什么办法可以在阻塞在http.getResponseCode();这句时,当超过一个时间后(如上边设置的三十秒),强制抛出个什么异常跳过
以便后边的代码改变连接方式为CMNET后再次尝试连接网络。
以前有强制关闭http并置null,网络连接线程里会立刻抛出IO异常,不知道为什么这次死活会阻塞在那
整了一个下午,郁闷了...

...全文
1724 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhudongjin 2010-09-08
  • 打赏
  • 举报
回复
楼主有没有你的源码啊 发来看看
ForWayfarer 2009-08-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 prok 的回复:]
教你个绝学:http=null;http.closed;瞬间就异常断开了。
[/Quote]

我试过了,这个没用,Http阻塞时,另一条线程也会被阻塞。
wyymaomi 2009-07-16
  • 打赏
  • 举报
回复
有代码可以参考下吗?
JarodYv 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 kf156 的回复:]
不知道大伙还有没有其他好的想法?主要就是软件首次运行时在较短的时间内判断用户的接入方式
目前好像只能超时后就不管这个网络连接线程,另外再开个网络连接
我先试下这思路,下午下班前结帖
[/Quote]
我们目前的处理方法是,根据经验,打包时默认一个接入方式。
第一次连接如果失败,则转换接入方式重新连接。连接成功,将正确的接入方式写入RMS。下次从RMS取接入方式进行连接。
这种方法的缺点是,如果默认的接入方式错了,第一次联网需要耗费一段时间是更改接入方式。更正过来后,后面不会再有这样的情况。

我们之前还有一种做法,就是第一次启动时同时开2条网络线程,分别用两种不同的接入方式。哪个线程先得到网络响应,就用哪个作为正确的接入方式,写入RMS。以后启动时都从RMS获取正确的接入方式。
这种做法的有点是,由于2个连接同时进行检查,不存在接入方式设置错误的情况,第一次联网时间会比较短。缺点也很明显,2条联网线程会影响联网速度,并且程序中要做更多的控制和保护。

经过一段时间的总结,我们找到并积累了市面上大部分手机的接入方式,而来就改成了现在的做法。
kf156 2009-04-17
  • 打赏
  • 举报
回复
不知道大伙还有没有其他好的想法?主要就是软件首次运行时在较短的时间内判断用户的接入方式
目前好像只能超时后就不管这个网络连接线程,另外再开个网络连接
我先试下这思路,下午下班前结帖
kf156 2009-04-17
  • 打赏
  • 举报
回复
我下午用前边说的那个思路:
开线程连接网络,等待返回
等待超过三十秒未收到返回,认为网络不通,抛弃
改变接入方式,另开个线程连接网络,继续等待
超过三十秒还未收到返回,认为网络不通 提示用户

测试OK,效果不错。

多谢各位给出的意见和建议,结帖!
lixiurui 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 JarodYv 的回复:]
引用 10 楼 lixiurui 的回复:
别想cmnet了,除非你明确的说明给用户要使用cmnet网络,否则不用代理直连地址真走cmnet的手机的用户肯定会投诉你的。

我们没有在讨论接入点,接入点是用户自己选的,KJava没法控制。我们讨论的是要不要加移动的网关,有些手机不加移动网关是访问不了网络的。
[/Quote]
当然要加了,为什么不加,明知道有的手机必须加还能不加啊。
至于楼主的问题,我提个思路,打开http联网的时候用这个方法试试 open(String name, int mode, boolean timeouts),设置超时。
设为空并且catch我认为解决不了问题,虽然你在j2me程序中可以认为这个线程已经结束了,但是实际上底层工作的线程不一定会结束,这个可以在某些支持同时http连接线程很少的手机上试试,同时打开最大连接个数的http连接,然后按照这种方法关闭其中一个,catch到异常的时候再去新建一个http线程看会不会发生io异常。
JarodYv 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lixiurui 的回复:]
别想cmnet了,除非你明确的说明给用户要使用cmnet网络,否则不用代理直连地址真走cmnet的手机的用户肯定会投诉你的。
[/Quote]
我们没有在讨论接入点,接入点是用户自己选的,KJava没法控制。我们讨论的是要不要加移动的网关,有些手机不加移动网关是访问不了网络的。
lixiurui 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 JarodYv 的回复:]
引用 8 楼 kf156 的回复:
不知道大伙还有没有其他好的想法?主要就是软件首次运行时在较短的时间内判断用户的接入方式
目前好像只能超时后就不管这个网络连接线程,另外再开个网络连接
我先试下这思路,下午下班前结帖

我们目前的处理方法是,根据经验,打包时默认一个接入方式。
第一次连接如果失败,则转换接入方式重新连接。连接成功,将正确的接入方式写入RMS。下次从RMS取接入方式进行连接。
这种方法的缺点是,如果…
[/Quote]
别想cmnet了,除非你明确的说明给用户要使用cmnet网络,否则不用代理直连地址真走cmnet的手机的用户肯定会投诉你的。
JarodYv 2009-04-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 prok 的回复:]
不会蹦出的。catch住
[/Quote]
catch住怎么去影响联网那条线程?判断超时和网络连接是在两个不同的线程中啊!
prok 2009-04-16
  • 打赏
  • 举报
回复
不会蹦出的。catch住
JarodYv 2009-04-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 prok 的回复:]
教你个绝学:http=null;http.closed;瞬间就异常断开了。
[/Quote]
真绝。程序直接NullPointerException崩出。
prok 2009-04-16
  • 打赏
  • 举报
回复
教你个绝学:http=null;http.closed;瞬间就异常断开了。
Sodino 2009-04-16
  • 打赏
  • 举报
回复
亚日是我的偶像.呵呵,不懂,坚决顶一下 .!!
Dantin 2009-04-16
  • 打赏
  • 举报
回复
不懂,帮顶
JarodYv 2009-04-16
  • 打赏
  • 举报
回复
正如你所说,代码阻塞在http.getResponseCode();这句。此时代码中任何对http的操作都是没用的。因为此时联网线程的控制权已经不在MIDlet中了,而是交给了底层平台的Native Code,因此你对http的任何操作均不起作用。也就是说,这段阻塞时间我们是没办法控制的。
如果楼主有行之有效的方法,不妨提供出来大家一起参考。

13,097

社区成员

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

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