今天在做一個項目的時候用到了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()
參考文章: