我有一台服务器和一台客户端。我的服务器通过套接字两次,一个接一个地写入客户端,两者都成功。客户端从服务器的第一次读取中读取数据,但在第二次读取时会阻塞,因为没有数据被发送。
可能是什么问题?
这可能是因为在从客户端读取之前调用了来自服务器的写入调用吗?
答案 0 :(得分:1)
这只是TCP的本质。它是一种流媒体协议,发送和读取之间没有一对一的关系。唯一的保证是发送的内容是收到的内容,按照发送的顺序。
写入必须发送至少1个字节,最多发送指定的字节数,或者介于两者之间的任何位置,因此可能需要多次写入才能完全发送给定的数据。网络可以对这些写入进行打包,但是它希望优化传输(除非您另外配置套接字)。
读取必须返回至少1个字节,并且最多返回指定的字节数,或者介于两者之间的任何位置,因此可能需要多次读取才能完全接收给定的数据,无论发送多少次写入。
TCP没有消息边界的概念,因此您必须以这样一种方式显式地对您发送的数据进行帧化,即接收方知道一条消息的结束位置和下一条消息的开始位置。之一:
在发送实际数据之前发送数据长度。接收器然后可以读取长度,然后读取长度指定的许多字节。
在数据末尾发送一个唯一的分隔符,保证不会出现在数据本身中。接收器然后可以读取,直到它遇到分隔符。