代码:
Socket socket;
InputStream is = socket.getInputStream();
int len = is.read(buffer);
在别处调用socket。Close后接收函数仍然阻塞,并不返回。服务端发来数据后,甚至仍然能够读出正确的数据,而之后才因为错误,说socket已经是null。

解决方案 »

  1.   

    socket最好设读超时setSoTimeout,服务端断开is.read应该会返回吧.
      

  2.   

    服务器端断开,read会返回,但是本地调用Close,read不返回,事实上也没有关闭,因为仍然能接收一次数据。异常发生在read完了之后。
      

  3.   

    意思就是,read读,阻塞。本地调close,服务端发数据,read返回正确读出(此时socket已经close,但是InputStream似乎并没有关闭,也就是事实上,底层的socket并没有关闭)数据,再次调用read,异常,此时底层socket才会关闭。那么我们怎么主动关闭socket,让服务器端知道,我们要关闭这个连接呢?
      

  4.   

    socket是交互式使用吗?
    不是可以在
    socket.Close前试试执行 socket.shutdownInput();  socket.shutdownOutput();
      

  5.   

    楼上方法可以 你看看socket手册调用socket.shutdownInput();read方法会直接异常在try finally 内关掉socket就可以了
      

  6.   

    好吧,我就是用的楼上2位的方法,我浏览Socket的方法是发现了上述函数,关socket不关流,不知道这种设计用意何在。Socket已经关闭的情况下,保留这个输入或输出流干什么?反正一用就异常。
      

  7.   

    socket.getOutputStream().close(); 
    socket.getInputStream().close(); 
    都会引起socket关闭,shutdownInput关闭输入流但不引起socket关闭.至于socket关闭为什么要保留输入输出流 这个可能跟回收机制有关,socket关闭了只是没被系统回收,等回收后会自动关闭。