小弟写了一段代码,用来多用户登入系统,总会有几个登入不上去,直接打开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();
}
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();
}
要不要在finally中释放一下连接
conn.connect();这个方法的作用,是建立和服务器的连接。
打开页面是用户的叫法,其实我们应该称为加载页面(或装载页面),
这个加载过程就是读取IO流的过程。楼主的代码里面,只对IO流,读取了一行文本,但,实际的IO流里面是多行文本组成的。
这个情况,要楼主多理解理解HTTP协议了,每次传输的文本,一般都是由多行文本组成的。
楼主在String s = br.readLine();这条语句上面加个循环结构,直到读不到数据再推出循环。关闭连接的语句,一般要写在finally块里面,这样能防止意外情况下没有关闭连接的情况。
这个是阻塞方法,会一直等待
但是,到了末尾,还会等么?如果永远读不到末尾,那我们会在乎这个等待,但是,如果能够读到末尾,我们在乎的是读出来的数据。
没有等待过程,哪来的数据?数据是要从服务端传输过来的,你用的readLine方法又是阻塞读,没有数据过来,当然要等待。
楼主用底层的URLConnection来连接服务端,那就同样需要将服务端的应答消息读取完毕,
如果客户端只读取一部分就断开连接,很容易使得服务端感应到连接断开而抛出异常,使得服务端程序没有顺序进行下去,造成不能100%登入的现象。为什么不是所有连接都是这个现象呢,是因为网络状况和系统环境造成的。
能完成登录的连接,有可能是这样的:
客户端读取部分数据断开连接,服务端已经将所有的应答消息内容传输到网络了,
这时客户端断开连接,服务端接到断开连接的信息会这认为很正常,因为要发送的信息都发送过去,
客户端已经断开连接了,没收到的数据也就没用了,会被丢弃。