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

先用标准库演示一下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 效果都是一样的。

视频我晚点时间奉上,