今天在写服务端客户端通信的时候,需要传文件的时候,服务端在两个客户端之间做文件的交接,发现客户端a发送完了文件,客户端b也把全部数据读到了本地,但是代码一直在阻塞,日志排除后,是read操作一直没有等到-1导致的。
出现的原因是:我想着先进行测试功能的测试,没有关闭Socket,所以会出现这种情况,这种情况需要关闭Socket
标准的解决方案:
- 当不再使用Socket时,可以直接通过Socket的OutputStream关闭,这样会关闭Socket
- 当还需要继续使用Socket时,使用Socket的shutdownOutput()方法关闭输出流
- 发送数据时,也可以约定某种协议,在数据的头部约定数据的长度,这样到达长度后就跳出循环,结束read
- 可以为Socket设置超时以防止永久挂起
socket.setSoTimeout(3000)
这样就会在指定时间后抛出异常,在异常中进行逻辑处理