HttpConnection的问题。

cidli 2003-08-08 01:01:51
在连续发 Http request请求时 会出现 HttpConnection getResponseCode() = -1 的情况。

请问这是什么原因 ?
...全文
130 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
skygui 2003-11-11
  • 打赏
  • 举报
回复
我写了一个HttpConnection的连接测试,使用388c手机无法正确使用,请指教
private String getHttpConnection(String url) throws IOException
{

HttpConnection hc =null;
DataInputStream is=null; // hc.openInputStream();
StringBuffer str = new StringBuffer();
try
{
hc =(HttpConnection) Connector.open(url);
is = new DataInputStream(hc.openDataInputStream());

int ch;
while ((ch=is.read())!=-1)
{
str.append((char) ch);
}
}
catch(Exception e)
{
e.printStackTrace();
str.append("open Error");
}
finally
{
try
{
if (is!=null) is.close();
if (hc!=null) hc.close();
}
catch(IOException ioe)
{
ioe.printStackTrace();
str.append("close Error");
}
}
return str.toString();
}

在模拟器无法取得数据,在真机上也无法取得数据。
真机上[JAVA应用]-[设置]-[默认连接]-CMWAP和CMNET都测试过,依然无法取得数据
有些没有数据返回,有些返回的数据为<html><head><title>Error</title></head><body>The parameter is incorrect.</body></html>
url="www.abkk.com"返回上述回应
url="www.yahoo.com"则没有返回,
为什么会这样?
liuyushen 2003-08-09
  • 打赏
  • 举报
回复
Keep-Alive没有用?cidli()教了我一课,我没试过,只是想当然尔。感谢cidli()

另外,很想搞清楚问题的根本原因。
问几个问题。
1既然A和B协同工作,HttpConnection对象如何在A和B里共享的?
2每次request后,处理完response,你怎么结束,关闭的?
Martin2002 2003-08-09
  • 打赏
  • 举报
回复
希望能和你详细讨论。msn:nier9240@hotmail.com
cidli 2003-08-09
  • 打赏
  • 举报
回复
sun 的 文档 不过是 j2se 的。http://java.sun.com/j2se/1.4.2/docs/guide/net/properties.html

http.keepAlive (default: true)
Indicates if keep alive (persistent) connections should be supported. Persistent connections improve performance by allowing the underlying socket connection be reused for multiple http requests.
The default is true and thus persistent connections will be used with http 1.1 servers. Set to 'false' to disable the use of persistent connections.

应该说 对 api的使用者来说,并不用去关心是否 keep-alive。是否resuse具体的物理连接是底层的事。

但是 j2me是怎样情况就不大清楚了。
有几点可以确定
1、从sniffer的监听结果看 ,如果不设 Keep-alive ,http head上不会自动加上这条。(host、content-length 等是可以自动加上的)
2、从 Api来看,没有显式的调用 keep-alive的方法。 仍然只能 open 一个 url 然后再close掉。




cidli 2003-08-09
  • 打赏
  • 举报
回复
简单说一下 :

之前的情况 :
类 A 负责 发送 request 和 接受 response。
类 B 负责 解析 response的内容。
当多次request后 getResponseCode()= -1。
用 Sniffer 察看 端口 。所有的 联结都未释放。

于是找了个最简单的例子直接在类A中试,发现联结正常释放。困惑.... 。
将 b 中的方法 移到 A 中再试, 也正常了 神奇...........。

真是 有点 ft了。

另外我设了 Keep-Alive 好像没什么用啊。

cidli 2003-08-09
  • 打赏
  • 举报
回复
或许没人相信, 我只是把某个方法 从一个 类 移到另一个类, 问题就解决了!简直荒谬!

出于某些考虑,欧不能把原码贴出来:(!不过私下很愿意和大家讨论:)。
cidli 2003-08-09
  • 打赏
  • 举报
回复
抱歉阿各位 , 出错的原因完全是我的疏忽, 在b类中使用 inputstream 之后没有关闭联结

而只是 在 a 类中 关闭了 connection 和 outputstream。也迷糊了大家一把 ,抱歉抱歉 惭愧惭愧 :(!

哎..................散分。
liuyushen 2003-08-09
  • 打赏
  • 举报
回复
Connection: Keep-Alive
conn.setRequestProperty("Connection","Keep-Alive");
注意大小写,有的服务器认大小写
jouny0 2003-08-08
  • 打赏
  • 举报
回复
up
c97164 2003-08-08
  • 打赏
  • 举报
回复
同意楼上的,接分!
cxhz_cn 2003-08-08
  • 打赏
  • 举报
回复
一般来说会返回
200----HTTP/1.0 200 OK
400----HTTP/1.0 401 Unauthorized

如果返回-1说明这是个不正确的Response

明白了吗
cidli 2003-08-08
  • 打赏
  • 举报
回复
可是 我在 方法最后 把 连接都close掉了!还会存在多连接嘛?

的确是每个request建立一次连接 ,我也觉得这样很傻:(!

关于HTTP1.1 KeepAlive方式是什么?能说的详细点嘛?(不用关闭连接?)

我的 email 是 li_970935@etang.com
msn 是 cid_li@hotmail.com

可能的话 ,多象你请教请教! 3ks!
liuyushen 2003-08-08
  • 打赏
  • 举报
回复
虽然你没有运行多线程,但是只要你运行getResponseCode,虚拟机必须自己起一个线程去做这件事情。否则整个虚拟机都会被阻塞住。
另外,你是不是每次request都重新建立连接?, 建议使用HTTP1.1 KeepAlive的方式.
cidli 2003-08-08
  • 打赏
  • 举报
回复
我反编译 mdip的class ,response code = -1 是由于实际的物理连接未能打开导致的。

另外我试了下连接超量的情况, 会报错

那么出现这种情况是为什么?
cidli 2003-08-08
  • 打赏
  • 举报
回复
我的连接不存在多线程,而且都在 finally 中关闭连接。怎么会出现http连接越界?
另外 request 可以保证是正确的。

不过的确是Connection的问题,因为 我改了改程序 放到 j2se下运行是正常的。

j2me的程序是在 wtk 1.03下运行的。

那位牛人贡献点经验!
liuyushen 2003-08-08
  • 打赏
  • 举报
回复
每个虚拟机都有允许http连接的数量限制。如果同时有太多的连接在工作中,虚拟机就不允许在连接了。由于Sun没有给出这个的标准,所以不同虚拟机反映不同。有的就throw Exception,看起来你用的虚拟机好像就返回ResponseCode -1了。

13,100

社区成员

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

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