不长篇大论了,设Socket io,则有两种方法判断对方是否在线:
1:
public boolean IsLinked(){
if(io==null)return false;
return io.getRemoteSocketAddress()!=null;
}
2:
public boolean IsLinked(){
if(io==null)return false;
return io.getLocalSocketAddress().toString().charAt(0)=='/';
}
在线返回true,不在线返回false。特别适用于只收不发的情况,因为只收不发的情况下,假如还使用了BufferedInputStream作为输入流(这个输入流是非阻塞的,对方掉线会返回空,没有数据也返回空),那么就没有办法知道对方是否掉线了,而有些时候又不想把写好的代码改成基于InputStream(阻塞的)的算法。
如果有频繁发送数据,可以选择使用catch()来判断,也可以所有方法同时使用。
Server中无法用方法1判断掉线,只能用方法2,而且此方法只能识别掉线,正常关闭socket也无法识别,需要发送消息或使用超时来辅助识别。
3:
如果使用java AIO的话,对方掉线时,channel会自动抛出异常,这种方法更好用,所以提倡大家使用AIO。
虽然BufferedReader也会在对方掉线时抛出异常,也是一种好办法,但是有一点不如AIO,那就是BufferedReader只能传输字符流,而AIO可以传输字节流。