2016-11-10 57 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|"); 

每個單詞的後|豎線是每個邏輯字之間的分隔符。你也可以使用空格而不是管道字符。或者有你自己的協議頭來指示要跟隨的字節數。無論如何,由接收方來解析來自字節流的消息一起形成應用消息。