今天在做一个项目的时候用到了Socket,但在读取数据的时候发现,服务器发来的TCP包被切包了,于是需要逐行读取,未满一行则继续等待下一包数据。
需求有了,但是如何实现呢?
常规的readline()方法是对文件使用的,方法见此篇博文。而此处是一个Socket,直接对Socket使用的话会报错,说不支持的类型。
询问度娘无果,遂问于谷哥。
得知Socket有一个方法函数,可以将Socket封装成一个文件,从而使用文件的readline()方法,研究Python Doc如下:
大体意思是:
此方法将返回一个和Socket相关的文件对象。文件对象引用的Socket文件描述符的dup()版本,所以文件对象和Socket对象可以被独立的关闭或垃圾回收。Socket必须工作于阻塞模式(不能有超时)。mode和bufsize参数和内置的file()函数相同。注意:在Windows上,使用makefile()创建的类文件对象,不可以被一个文件描述符的文件对象使用,例如:subprocess.Popen()的流参数。
于是可以有如下使用方法:
socket.makefile().readline()
参考文章: