笔者是一个初学者,写本文前还不知道长连接一词,只是在做关于socket的练习时,希望服务端和客户端使用一个socket进行多次数据的传输,但是发现一个问题,如果一端使用socket发送数据后不使用 socket.shutdownOutput();去关闭输出,接受端就会一直卡死在接受处。查资料发现,这个方法会为发送的数据添加一个结束标志,也就是-1,如果不加就会缺失这个标志,接收端就会一直认为发送端没有结束发送,导致卡死在接收数据处。同样的,直接使用socket.close()也会添加这个结束标志,二者却别在于前者只关闭了输出,后者关闭了整个连接(即使同时shutdownInput和showdownOutput也没有关闭连接,只是关闭了这个连接发送和接受数据的能力)而使用了socket.shutdownOutput()之后,该socket是无法再次getOutputStream的,也就无法再次发送数据,因此通过简单的方式实现长连接是不可能的。必须要加上心跳包一类的东西,这就触及到了笔者这个初学者的知识盲区。
使用socket试图保持长连接遇到的错误
于 2024-05-21 22:52:19 首次发布