在java中一般的Socket开发是基于TCP的,通讯机制一般是首先Server端开启监听,等待Client连接。当Server端收到Client发起的连接后,Server端会发新建一个线程去处理该链接,Server继续监听新的连接。在有些需求中,要求当客户端长时间不发送信息时,服务器端应主动关闭此链接,以结束此线程,以免影响Server端效率。JDK API中Socket类提供了一个setSoTimeout(int timeout)函数可以解决此类问题。 此函数设置的超时时间并不是socket链接超时时间,而是socket.getInputStream()的阻塞时间,也即没有读到对方发送信息的时间,超时过后会抛出一个 SocketTimeoutException 。参考代码如下:
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.net.SocketTimeoutException;
public class DoSocket extends Thread {
private Socket socket;
public DoSocket(Socket socket) {
this.socket = socket;
this.start();
}
@Override
public void run() {
System.out.println("连接成功");
System.out.println(socket);
while (!(socket.isClosed())) {
try {
InputStream input = socket.getInputStream();
byte[] buf = new byte[1024];
int len = input.read(buf);
socket.setSoTimeout(5 * 1000);</span>
if (len == -1) {
break;
}
System.out.println(new String(buf, 0, len));
} catch (SocketTimeoutException e) {
System.out.println("socket 连接超时服务端主动关闭");
break;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("socket连接断开");
}
}