小弟写了一段代码,用来多用户登入系统,总会有几个登入不上去,直接打开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();
            }

解决方案 »

  1.   

    同时登几个啊
    要不要在finally中释放一下连接
      

  2.   

    报的什么错误,把关闭连接放在finilly里面
      

  3.   

    因为打开网页的时候服务器响应正常, 就是不报错我看加一个finilly试一下。
      

  4.   

    弱弱的问一句, conn.connect();是不是等这个网页完全打开100%后才循环到下一条吗?
      

  5.   

    问题应该出在IO读取数据的过程。
    conn.connect();这个方法的作用,是建立和服务器的连接。
    打开页面是用户的叫法,其实我们应该称为加载页面(或装载页面),
    这个加载过程就是读取IO流的过程。楼主的代码里面,只对IO流,读取了一行文本,但,实际的IO流里面是多行文本组成的。
    这个情况,要楼主多理解理解HTTP协议了,每次传输的文本,一般都是由多行文本组成的。
    楼主在String s = br.readLine();这条语句上面加个循环结构,直到读不到数据再推出循环。关闭连接的语句,一般要写在finally块里面,这样能防止意外情况下没有关闭连接的情况。
      

  6.   

    String s = br.readLine();
    这个是阻塞方法,会一直等待
      

  7.   

    是的,服务端写出方法一般都抛受检异常IOException,客户端未读完就关闭表示一个interrupted I/O operation,反应到服务端就会抛出异常,所以一般不应该有问题的
      

  8.   

    没到末尾当然会等,数据要传输嘛,
    但是,到了末尾,还会等么?如果永远读不到末尾,那我们会在乎这个等待,但是,如果能够读到末尾,我们在乎的是读出来的数据。
    没有等待过程,哪来的数据?数据是要从服务端传输过来的,你用的readLine方法又是阻塞读,没有数据过来,当然要等待。
      

  9.   

    每次浏览器提交一个请求,都会尝试将服务端的应答消息完全读取完毕,也就是我们从浏览器看到的页面内容。
    楼主用底层的URLConnection来连接服务端,那就同样需要将服务端的应答消息读取完毕,
    如果客户端只读取一部分就断开连接,很容易使得服务端感应到连接断开而抛出异常,使得服务端程序没有顺序进行下去,造成不能100%登入的现象。为什么不是所有连接都是这个现象呢,是因为网络状况和系统环境造成的。
    能完成登录的连接,有可能是这样的:
    客户端读取部分数据断开连接,服务端已经将所有的应答消息内容传输到网络了,
    这时客户端断开连接,服务端接到断开连接的信息会这认为很正常,因为要发送的信息都发送过去,
    客户端已经断开连接了,没收到的数据也就没用了,会被丢弃。