最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(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ó)家法律
卢龙县| 资中县| 武陟县| 普定县| 沽源县| 临朐县| 梅河口市| 谷城县| 中卫市| 哈尔滨市| 桃源县| 永年县| 来宾市| 德令哈市| 太仆寺旗| 安远县| 嘉禾县| 尼木县| 商都县| 齐齐哈尔市| 建德市| 高密市| 玉屏| 综艺| 崇礼县| 阳信县| 东莞市| 青海省| 华宁县| 游戏| 三原县| 大英县| 南充市| 吉木乃县| 玛曲县| 罗城| 永城市| 抚宁县| 扬中市| 凭祥市| 库伦旗|