客户端和服务器正在通信,你突然关掉了客户端,他肯定要出异常的。这个异常需要你自己来处理(而不是让他打印堆栈信息)。
try{
//代码块
//这里一般会用一个while(//连接中){
//判断接收的信息是退出的标志,是则按正常退出
//否则,处理信息
//继续读
}
}catch(Exception e){ //exception的类型最好写具体的子类
System.out.println("客户端连接中断...."+socket);
}finally{
//在这里关闭这个客户端的socket
socket.close();
}
楼主啊,socket其实就是2个人堵住中间管子里的水一样,一个人走,水肯定会流出去啊,
Connection reset代表客户端程序退出( system.exit(0) ), 堵管子的人直接走了,水流出(内存溢出)
isClosed()代表socket.closed();堵管子的人把阀门关闭,然后走了,水照样还在管子里面
你考虑不全啊
把你的这个Connection reset异常catch一下,提示客户端程序退出
isClosed()提示连接断开
两个不一样的概念
结束的时候 socket.close().. 之前做socket通讯的时候,报错只要不影响程序正常运行,就让它报去吧.不要把太多的时间放到找错上面,尤其是找了半天没找到的时候.
个人感觉可能是这样:平常里没事,关闭的瞬间出现了错误,可能是出现了线程死锁。一方面服务器等待被关闭的客户机的数据以关闭服务线程,于是服务器无法跳出循环。另一方面其他客户又要向服务器写数据。这里主要是没有使用close();不知道socket里边有没有shutdown()这个函数,如果有的话,close()换成shutdown()会比较好;没有shutdown()你就老实的写close()。
你程序最后有close()吗