java.net.Socket 中长连接闲置后,写入数据时异常的解决。

Socket中,一旦对方断开连接,己方可能会未被通知,而依然认为对方存在且发送数据,此时会报写数据的异常:Connect reset by peer:Socket write error.

经过试验,解决这个异常的一个较好的办法是,在建立连接后,通过一个线程持续侦听(socket.read(buff)<1)该连接的读数据流,一旦对方断开连接,此读数据流会相应的报出reset异常或者read方法解除阻塞并返回0,表示所在连接已经被对方关闭,收到通知即可处理该连接。

 

在使用线程对Socket进行read/write阻塞操作时,如果对线程执行interrupt(),是不会中断该线程的,执行该函数的目的,在于中断那些通过wait/sleep/join阻塞/睡眠的线程,通过设置标识位,让线程执行退出,实际上也就是释放线程对锁的持有。但是在进行Socket等的IO阻塞操作时,持有锁的对象是Socket,而不是线程,所以执行interrupt,线程不会有任何反应,因为其不持有任何锁。所以应用这种方式对Socket进行操作时,需要另行Socket进行操作才可以中断线程。

posted on 2012-09-17 10:07  過眼云煙  阅读(445)  评论(0)    收藏  举报

导航