用HttpURLConnection自动登入不能100%登入

tcmis 2013-03-20 09:13:40
小弟写了一段代码,用来多用户登入系统,总会有几个登入不上去,直接打开url,是可以登入进去的, 所有用户都测试过,可以登入的, 不知道出现这种情况怎么处理以下, 希望大侠指点一下,谢谢
for (int i = 0; i < allUrls.size(); i++) {
String curLoginUrl = allUrls.get(i).toString();

try {

url = new URL(curLoginUrl);
conn = (HttpURLConnection) url.openConnection();
conn.setUseCaches(false);
conn.setRequestMethod("GET");

conn.setDoOutput(true);
conn.setDoInput(true);
conn.setConnectTimeout(50000);
conn.setReadTimeout(50000);

conn.connect();

BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "gbk"));
String s = br.readLine();

conn.disconnect();

} catch (SocketTimeoutException e) {
txlog.append(" 连接服务器超时\n");
conn.disconnect();
} catch (Exception e) {
txlog.append(" 登入失败\n");
conn.disconnect();
}
...全文
200 14 打赏 收藏 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰思雨 2013-03-22
  • 打赏
  • 举报
回复
每次浏览器提交一个请求,都会尝试将服务端的应答消息完全读取完毕,也就是我们从浏览器看到的页面内容。 楼主用底层的URLConnection来连接服务端,那就同样需要将服务端的应答消息读取完毕, 如果客户端只读取一部分就断开连接,很容易使得服务端感应到连接断开而抛出异常,使得服务端程序没有顺序进行下去,造成不能100%登入的现象。 为什么不是所有连接都是这个现象呢,是因为网络状况和系统环境造成的。 能完成登录的连接,有可能是这样的: 客户端读取部分数据断开连接,服务端已经将所有的应答消息内容传输到网络了, 这时客户端断开连接,服务端接到断开连接的信息会这认为很正常,因为要发送的信息都发送过去, 客户端已经断开连接了,没收到的数据也就没用了,会被丢弃。
冰思雨 2013-03-22
  • 打赏
  • 举报
回复
引用 12 楼 jike316 的回复:
没到末位是会等待的
没到末尾当然会等,数据要传输嘛, 但是,到了末尾,还会等么? 如果永远读不到末尾,那我们会在乎这个等待,但是,如果能够读到末尾,我们在乎的是读出来的数据。 没有等待过程,哪来的数据?数据是要从服务端传输过来的,你用的readLine方法又是阻塞读,没有数据过来,当然要等待。
dracularking 2013-03-21
  • 打赏
  • 举报
回复
引用 5 楼 preferme 的回复:
问题应该出在IO读取数据的过程。 Java code?1conn.connect();这个方法的作用,是建立和服务器的连接。 打开页面是用户的叫法,其实我们应该称为加载页面(或装载页面), 这个加载过程就是读取IO流的过程。 楼主的代码里面,只对IO流,读取了一行文本,但,实际的IO流里面是多行文本组成的。 这个情况,要楼主多理解理解HTTP协议了,每次传输……
不读完就关闭连接的话应该也没问题吧
2399 2013-03-21
  • 打赏
  • 举报
回复
String s = br.readLine(); 这个是阻塞方法,会一直等待
冰思雨 2013-03-21
  • 打赏
  • 举报
回复
问题应该出在IO读取数据的过程。
conn.connect();
这个方法的作用,是建立和服务器的连接。 打开页面是用户的叫法,其实我们应该称为加载页面(或装载页面), 这个加载过程就是读取IO流的过程。 楼主的代码里面,只对IO流,读取了一行文本,但,实际的IO流里面是多行文本组成的。 这个情况,要楼主多理解理解HTTP协议了,每次传输的文本,一般都是由多行文本组成的。 楼主在String s = br.readLine();这条语句上面加个循环结构,直到读不到数据再推出循环。 关闭连接的语句,一般要写在finally块里面,这样能防止意外情况下没有关闭连接的情况。
tcmis 2013-03-21
  • 打赏
  • 举报
回复
弱弱的问一句, conn.connect();是不是等这个网页完全打开100%后才循环到下一条吗?
tcmis 2013-03-21
  • 打赏
  • 举报
回复
因为打开网页的时候服务器响应正常, 就是不报错 我看加一个finilly试一下。
  • 打赏
  • 举报
回复
报的什么错误,把关闭连接放在finilly里面
2399 2013-03-21
  • 打赏
  • 举报
回复
引用 8 楼 preferme 的回复:
引用 6 楼 jike316 的回复:String s = br.readLine(); 这个是阻塞方法,会一直等待 这个是阻塞方法,但是,在网络通畅、服务处理顺畅的情况下,是不会一直等待的。 没有等待,那里来的加载过程?数据传输,总是需要一定的时间的。 引用 7 楼 dracularking 的回复:不读完就关闭连接的话应该也没问题吧 有没有问题,要看服务……
没到末位是会等待的
dracularking 2013-03-21
  • 打赏
  • 举报
回复
引用 8 楼 preferme 的回复:
引用 6 楼 jike316 的回复:String s = br.readLine(); 这个是阻塞方法,会一直等待 这个是阻塞方法,但是,在网络通畅、服务处理顺畅的情况下,是不会一直等待的。 没有等待,那里来的加载过程?数据传输,总是需要一定的时间的。 引用 7 楼 dracularking 的回复:不读完就关闭连接的话应该也没问题吧 有没有问题,要看服务……
是的,服务端写出方法一般都抛受检异常IOException,客户端未读完就关闭表示一个interrupted I/O operation,反应到服务端就会抛出异常,所以一般不应该有问题的
chengfenmuyu 2013-03-21
  • 打赏
  • 举报
回复
错误信息不贴出来~?
tcmis 2013-03-21
  • 打赏
  • 举报
回复
谢谢,各位, 我再修改修改。
冰思雨 2013-03-21
  • 打赏
  • 举报
回复
引用 6 楼 jike316 的回复:
String s = br.readLine(); 这个是阻塞方法,会一直等待
这个是阻塞方法,但是,在网络通畅、服务处理顺畅的情况下,是不会一直等待的。 没有等待,那里来的加载过程?数据传输,总是需要一定的时间的。
引用 7 楼 dracularking 的回复:
不读完就关闭连接的话应该也没问题吧
有没有问题,要看服务端的处理逻辑,有些情况下,是会产生影响的。
dracularking 2013-03-20
  • 打赏
  • 举报
回复
同时登几个啊 要不要在finally中释放一下连接

62,620

社区成员

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

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