PySide6中TCP套接字?jǐn)?shù)據(jù)的粘包處理便捷方案

先用標(biāo)準(zhǔn)庫(kù)演示一下TCP套接字的粘包問題
上面的代碼
創(chuàng)建了一個(gè)窗口,窗口中有一個(gè)文本區(qū)域。
啟動(dòng)了一個(gè)socket本地監(jiān)聽,為了不阻塞主進(jìn)程,把這個(gè)socket本地監(jiān)聽放入了線程中。
然后我們啟動(dòng)一個(gè)客戶端,連續(xù)發(fā)送10次 hello\n 字節(jié)。
看看效果

可以看到10次hello\n 字節(jié)粘在一起被接收了。
接下來使用PySide內(nèi)置的 QTcpServer和QTcpSocket來進(jìn)行演示。
QTcpSocket 有3個(gè)讀取數(shù)據(jù)的方法
readAll() ?將數(shù)據(jù)一次性全部讀取出來。如果有多行,這些行會(huì)包含換行符的連接成一行。
readLine(maxlen=0) ?讀取一行數(shù)據(jù),一行的判斷是讀到一個(gè)換行符為止,\n,\r\n 都可以,maxlen也可以指定讀取的長(zhǎng)度。利用好可以很方便的處理粘包問題
readLineData(maxlen) ?讀取一行指定長(zhǎng)度的的數(shù)據(jù),
第一種方法 readAll() 顯然會(huì)發(fā)生粘包現(xiàn)象。
第三種適合固定數(shù)據(jù)廠區(qū)的場(chǎng)景。
第二種來處理粘包比較合適,因?yàn)槲覀儼l(fā)送的時(shí)候放在末尾的終結(jié)符 \n本身就是一個(gè)換行符。
下面是演示代碼
代碼說明:
QTcpServer 替代標(biāo)準(zhǔn)的socket的server模式。可以不用再另外起一個(gè)線程,因?yàn)镼TcpServer本身的行為就類似一個(gè)線程。
self.socket_thread.newConnection.connect(self.new_connection_slot)
?這一行將客戶端的連接信號(hào)接到我們自定義的槽函數(shù)self.new_connection_slot上self.new_connection_slot 槽函數(shù)會(huì)取出客戶端,然后把客戶端的 readyRead 信號(hào)連接到自定義的槽函數(shù)進(jìn)行處理
self.sock_ready_read 槽函數(shù)將收到的數(shù)據(jù)呈現(xiàn)在界面上。
同樣我們啟動(dòng)一個(gè)客戶端,連續(xù)發(fā)送10次 hello\n 字節(jié)。
看看效果

無論是 \n 還是 \r\n 效果都是一樣的。

視頻我晚點(diǎn)時(shí)間奉上,