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

歡迎光臨散文網(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ó)家法律
南华县| 建德市| 龙州县| 博客| 丹棱县| 比如县| 大埔县| 邓州市| 巍山| 达拉特旗| 宁海县| 丹阳市| 乐山市| 舞阳县| 和田县| 滨州市| 阿城市| 福鼎市| 青河县| 大新县| 芜湖市| 营口市| 华坪县| 杨浦区| 灵宝市| 元氏县| 松阳县| 怀来县| 朔州市| 达拉特旗| 莱阳市| 深州市| 剑河县| 河北省| 阳高县| 库车县| 两当县| 九龙坡区| 自治县| 桐柏县| 南漳县|