硅谷视频未调用socket.shutdownOutput()导致阻塞,但还有无需调用该方法的情况
发布时间
阅读量:
阅读量
在硅谷某神的视频实例3中,若未调用socket.shutdownOutput()方法,服务端将会陷入阻塞状态。然而,在实例1与实例2中并未使用该方法,却未出现阻塞现象,这是为何?经过一番查找后终于明白原因所在。
socket.shutdownOutput()的功能是关闭数据输出通道,其作用是向服务端发送一个“数据已发送完毕”的信号。如果不使用该方法,则服务端的读取操作将持续处于阻塞状态,直到接收到流末尾的标记后才会返回-1。
在实例3中之所以需要调用此方法,是因为客户端需要接收服务端返回的消息。通过执行socket.shutdownOutput(),可以让服务端的while循环终止读取操作,并继续执行后续向客户端发送消息的代码部分。
而实例1和实例2无需调用该方法的原因在于它们并不需要接收服务端返回的消息,而是直接通过socket.close()结束连接。同样地,socket.close()也会向服务端传递一个终止信号。
以下代码未使用try-catch-finally结构处理异常,请忽略此部分。
客户端将文件发送至服务端,由服务端负责将文件存储于本地
@Test
public void client() throws IOException {
Socket socket = new Socket(InetAddress.ge
全部评论 (0)
还没有任何评论哟~
