使用TCP套接字,我的客户端/服务器的情况是从客户端发送消息,服务器正在接收和写入文件。我遇到的问题是出于某种原因,即使我将消息分开,它们都被收到了一行。
所以例如..假设我使用以下方式逐行发送文本文件:
socket->write(msg.toUtf8().constData());
socket->waitForBytesWritten(5000);
服务器有时会在一次接收中收到多条消息。
所以如果文本文件说:
您好,
这是客户
有时服务器会收到"你好这是客户端",当它们应该是分开的时候一起接收这两个消息。
有人可能会说我编码错了,但奇怪的是,如果我在本地测试客户端/服务器,那一切都很完美。一旦我通过网络这样做,这个问题就开始发生了。我做了一些测试,在发送消息之间增加了延迟。这也解决了问题,但只是在我将延迟增加到每条消息近1秒之后。如果需要发送大量消息,这是一个问题,每个消息最终花费很长时间。
答案 0 :(得分:4)
请记住,TCP是流式协议。没有自然的消息边界,数据只是一个字节流。
如果要将消息分开,则必须在TCP之上添加包含这些边界的协议。对于文本,换行符是自然边界,并且在许多基于文本的协议中使用。