日期:2014-05-20  浏览次数:21029 次

Socket送信的outputstream.write()的问题
我做的是客户端,主要功能是向服务器发送文件。
现在的现象是如果服务器切断的时候,客户端代码停在
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; //
}