1 在客户端和服务器端做心跳检测(这个后来我放弃了)
2 客户端中断连接,服务器会抛出异常,利用这点
3这是我为什么不用心跳包的原因,因为不需要了。 有的时候,我们可能网络突然中断了。
但是服务器依然会监听那个连接。而且很长都不抛异常。
这时候只要设置超时异常就行了。
socket.setSoTimeout(5000);
这样不管程序是不是阻塞在read方法,还是给客户端发包。
对方只要5秒没有响应,就会抛出如下异常。
driver客户端连接已断开! java.net.SocketTimeoutException: Read timed out at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(Unknown Source) at java.net.SocketInputStream.read(Unknown Source) at java.io.BufferedInputStream.fill(Unknown Source) at java.io.BufferedInputStream.read(Unknown Source) at java.io.ObjectInputStream$PeekInputStream.peek(Unknown Source) at java.io.ObjectInputStream$BlockDataInputStream.peek(Unknown Source) at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source) at java.io.ObjectInputStream.readClassDesc(Unknown Source) at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) at java.io.ObjectInputStream.readObject0(Unknown Source) at java.io.ObjectInputStream.readObject(Unknown Source) at servers.driverThread.run(driverThread.java:42) at java.lang.Thread.run(Unknown Source) code:code0101,数据库已经更新为离线状态. 检测异常时间:5755 status:false —————————————————————— driver客户端连接已关闭! client客户端连接已断开! 检测异常时间:5000 —————————————————————— client连接已关闭! java.net.SocketTimeoutException: Read timed out at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(Unknown Source) at java.net.SocketInputStream.read(Unknown Source) at sun.nio.cs.StreamDecoder.readBytes(Unknown Source) at sun.nio.cs.StreamDecoder.implRead(Unknown Source) at sun.nio.cs.StreamDecoder.read(Unknown Source) at java.io.InputStreamReader.read(Unknown Source) at java.io.BufferedReader.fill(Unknown Source) at java.io.BufferedReader.readLine(Unknown Source) at java.io.BufferedReader.readLine(Unknown Source) at servers.clientThread.run(clientThread.java:38) at java.lang.Thread.run(Unknown Source)