欢迎光临散文网 会员登陆 & 注册

PySide6中TCP套接字数据的粘包处理便捷方案

2023-08-30 08:00 作者:宝宝龙的爸爸  | 我要投稿

先用标准库演示一下TCP套接字的粘包问题

上面的代码

  • 创建了一个窗口,窗口中有一个文本区域。

  • 启动了一个socket本地监听,为了不阻塞主进程,把这个socket本地监听放入了线程中。

然后我们启动一个客户端,连续发送10次 hello\n 字节。

看看效果

粘包演示

可以看到10次hello\n 字节粘在一起被接收了。

接下来使用PySide内置的 QTcpServer和QTcpSocket来进行演示。

QTcpSocket 有3个读取数据的方法

  • readAll()  将数据一次性全部读取出来。如果有多行,这些行会包含换行符的连接成一行。

  • readLine(maxlen=0)  读取一行数据,一行的判断是读到一个换行符为止,\n,\r\n 都可以,maxlen也可以指定读取的长度。利用好可以很方便的处理粘包问题

  • readLineData(maxlen)  读取一行指定长度的的数据,

第一种方法 readAll() 显然会发生粘包现象。

第三种适合固定数据厂区的场景。

第二种来处理粘包比较合适,因为我们发送的时候放在末尾的终结符 \n本身就是一个换行符。


下面是演示代码

代码说明:

  • QTcpServer 替代标准的socket的server模式。可以不用再另外起一个线程,因为QTcpServer本身的行为就类似一个线程。

  • self.socket_thread.newConnection.connect(self.new_connection_slot)

     这一行将客户端的连接信号接到我们自定义的槽函数self.new_connection_slot上
  • self.new_connection_slot 槽函数会取出客户端,然后把客户端的 readyRead 信号连接到自定义的槽函数进行处理

  • self.sock_ready_read 槽函数将收到的数据呈现在界面上。


同样我们启动一个客户端,连续发送10次 hello\n 字节。

看看效果

粘包问题已得到解决


无论是 \n 还是 \r\n 效果都是一样的。

视频我晚点时间奉上,

PySide6中TCP套接字数据的粘包处理便捷方案的评论 (共 条)

分享到微博请遵守国家法律