2016-11-10 58 views
0

使用如何在使用qtcpsocket时编写一个字符串?

tcpsocket->write("hello"); 

tcpsocket->write("world"); 

etc.. 

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

,当它在一个字符串发送的“Hello World”使用与QTcpSocket,如何发送字符串,我想要什么使它只写一个时刻,我希望让客户recive“你好”,然后“世界”。

回答

4

这不是TCP的工作方式。 TCP是一种字节流协议,不是消息协议。您可能会在发送端以编程方式写入N个字节,但远程端可能不会同时收到全部N个字节。实际上,当它在其末尾执行recv时,它可能只会得到1个字节,N-1个字节或一些其他数量的字节。诸如IP碎片,TCP分段,TCP窗口大小等问题可能会影响到这一点。此外,如果您将“Hello”和“World”分别写入套接字,则可以轻松地将消息合并(在发送方或接收方),以便一次接收“HelloWorld”。同样,因为TCP是一个字节流,而不是基于消息的协议。

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

当你想做的事:

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

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

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