当前位置: 代码迷 >> J2EE >> ServerSocket超时有关问题
  详细解决方案

ServerSocket超时有关问题

热度:82   发布时间:2016-04-17 23:12:52.0
ServerSocket超时问题
我新建一个ServerSocket,代码如下:
ServerSocket serviceSocket = new ServerSocket(3434);
while (true) {
Socket socket = null;
// 接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
Socket socket = serviceSocket.accept();
//设置无通讯超时时间,tcp链接超过空闲时间就会抛出异常然后关闭连接
socket.setSoTimeout(60000);
service.execute(new SocketHandler(socket));
}

SocketHandler的代码如下:
 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
logger.info("reader流已经建立。。。。");
StringBuffer socketMsg = new StringBuffer();
String msg = null;
while ((msg = br.readLine()) != null) {
       socketMsg.append(msg); 
logger.info("服务器端接受信息:" + msg);
if (msg.endsWith("#")) {//遇到#时就结束接收  
          break;  
 }  
}
logger.info("服务器端接受信息:" + socketMsg.toString());
现在出现一个问题,客户端socket已经连接成功,BufferedReader流也已经新建成功了,但是在br.readLine()的时候抛出一个异常:
java.net.SocketTimeoutException: Read timed out
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:152)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
请高手指教,谢谢
------解决思路----------------------
根据你们的响应报文可以看出来是以"#"作为结束符的,而readLine方法需要"\n"作为结束符,所以readLine会一直等待,直到socket连接超时。因此,你们可以尝试通过逐个字符进行读取,如下:

BufferedReader in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
StringBuffer sb = new StringBuffer();

int b ;
// ASCII中的#为35
while ((b = in.read()) != 35) {
sb.append((char)b);
}
System.out.println("Server:"+sb.toString());