原文:https://blog.youkuaiyun.com/u012525096/article/details/76924627
发送数据(out.write)后,调用out.close(),当接收数据a=in.read(data)时,报错。
错误代码:socket recvfrom failed: EBADF (Bad file descriptor)
首先尝试:将out.close()移动至代码块最后,但发现服务器端的in.read(data)不会返回-1,造成死循环。
经过查询得知,Java的socket是一个全双工套接字,任何的输入流或输出流的close()都会造成Socket关闭。
解决办法:使用socket.shutdownOutput()方法关闭套接字的输出流,使服务器知道输出流关闭,可以得到流末尾标志(-1)。
同样,可以使用socket.shutdownInput()方法单独关闭套接字的输入流。
总结
-
在客户端或者服务端通过socket.shutdownOutput()都是单向关闭的,即关闭客户端的输出流并不会关闭服务端的输出流,所以是一种单方向的关闭流;
-
通过socket.shutdownOutput()关闭输出流,但socket仍然是连接状态,连接并未关闭
-
如果直接关闭输入或者输出流,即:in.close()或者out.close(),会直接关闭socket