五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

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

2023-08-30 08:00 作者:寶寶龍的爸爸  | 我要投稿

先用標(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í)間奉上,

PySide6中TCP套接字?jǐn)?shù)據(jù)的粘包處理便捷方案的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
若羌县| 邵东县| 石嘴山市| 海原县| 霞浦县| 临夏县| 梅河口市| 阳西县| 湘潭县| 云安县| 剑阁县| 承德县| 稻城县| 和顺县| 邹城市| 兴宁市| 洱源县| 芦山县| 通江县| 安多县| 道孚县| 隆化县| 东乌珠穆沁旗| 东乌珠穆沁旗| 新营市| 西乡县| 莫力| 龙山县| 读书| 武川县| 彝良县| 海阳市| 洛川县| 辽宁省| 平果县| 永和县| 达州市| 太原市| 厦门市| 嘉兴市| 治县。|