如何使用qtcpsocket一次写一个字符串?

Posted

技术标签:

【中文标题】如何使用qtcpsocket一次写一个字符串?【英文标题】:how to write one string at time using qtcpsocket? 【发布时间】:2016-11-10 02:22:15 【问题描述】:

使用Qtcpsocket时如何发送字符串

tcpsocket->write("hello");

tcpsocket->write("world");

etc..

tcpSocket->flush();
tcpSocket->waitForBytesWritten(3000);

它以一个字符串“hello world”发送,我想让它一次只写一个,我想让客户端接收“hello”然后是“world”。

【问题讨论】:

【参考方案1】:

这不是 TCP 的工作方式。 TCP是字节流协议,不是消息协议。您可以在发送端以编程方式写入 N 个字节,但远程端可能不会一次接收所有 N 个字节。事实上,当它在其末尾执行recv 时,它可能只获得 1 个字节、N-1 个字节或其他一些字节数。 IP 分段、TCP 分段、TCP 窗口大小等问题都会影响这一点。

此外,如果您将“Hello”和“World”分别写入套接字,则消息很容易被合并(在发送方或接收方),这样“HelloWorld”就会被一次性接收。同样,因为 TCP 是字节流,而不是基于消息的协议。

当您编写 TCP 代码时,您必须处理这些问题,因为它们确实会发生。

当你想做的时候:

每个词都是一个“信息”。但是每条消息都需要它只是封装。也许你可以这样发送消息:

 tcpsocket->write("hello|");
 tcpsocket->write("world|");

每个单词的结尾| 管道字符是每个逻辑单词之间的分隔符。您也可以使用空格而不是管道字符。或者有你自己的协议头来指示要遵循的字节数。无论如何,由接收方将字节流中的消息解析回一起以形成应用程序消息。

【讨论】:

以上是关于如何使用qtcpsocket一次写一个字符串?的主要内容,如果未能解决你的问题,请参考以下文章

QTcpSocket如何返回QString

1[简答题] 字节输出流写出字节数据 利用字节输出流一次写一个字节的方式,向D盘的a.txt文件输出字符‘a’。

如何使用 QTcpSocket 读取超过 8192 字节?

Qt - 当一个类中有多个 QTcpSocket 时,我如何知道哪个 QTcpSocket 发出了 readyRead 信号?

如何使用 QTcpSocket 获取 Protobuf 发送的数据 [重复]

如何在代码中应用设计模式