我做的是客户端,主要功能是向服务器发送文件。
现在的现象是如果服务器切断的时候,客户端代码停在
outputstream.write(lbuf)这里。客户端无法终止(本来应该出个超时异常的,程序中止)
try {
output = socket.getOutputStream();
output.write(lbuf); //程序停在这里!!!!!!!!
} catch (Exception e) {
return -1; //
}
想问大佬们,什么情况下,程序会阻塞在write这里?
------解决方案--------------------
服务器端出异常,socket需要再次连接才能检测出来。
如果这个时候发送数据,即调用write,因为该方法会等待接收方接收完毕,如果没接收完毕就一直堵塞。
所以你可以写个timeout监控,即调用write方法前,设置一个flag,同时启动一个线程,该线程隔一定时间,检查一下flag,如果flag改变,则线程结束,否则,当超过一定时间以后,可以看作是超时,关闭socket,并退出线程。write方法调用结束后,改变flag
for example
- Java code
try { output = socket.getOutputStream(); final StringBuilder flag = new StringBuilder(); new Thread() { public void run() { long start = System.currentTimeMillis(); while (flag.length()==0) { long end = System.currentTimeMillis(); if (end - start > xxxx) { your_socket.close(); break; } sleep(100); } } }.start(); output.write(lbuf); flag.append("end");} catch (Exception e) { return -1; //}