python socket_【经验分享】解决Python socket recv()数据为空 | 勤奋的小青蛙

解决Python socket.recv()接收空数据问题
在Python中使用socket编程时,遇到客户端socket.recv()偶尔返回空数据的问题。通过调试发现,socket.recv(n)不一定按指定长度接收完整数据。为确保接收所有数据,自定义了一个RecvN函数,循环调用recv()直到接收到指定字长的内容。

不久之前,我曾经把Linux下Socket与windows下python socket自定义协议通信完成,但是后来使用过程中发现一些bug,当接收发送数据的缓冲区足够大时,python作为客户端接收数据,经常出现接收为空数据的情况,检查下Linux服务端,发现服务端是把数据已经发送出来的,但是Python socket的recv()就是偶尔出现接收不到数据的情况。

经过一番调试,后来找到原因,原来Python的socket.recv(n)函数,并没有真正将我们希望接收的数据字长n全部接收,只需要保证Python将我们希望接收的所有长度接收即可。那么根据需求,我们自己实现一个接收的函数即可:

#------------------------------------------------------

# RecvN

# recv N bytes to target

#------------------------------------------------------

def RecvN(socket, n):

totalContent = b''

totalRecved = 0

while totalRecved < n:

onceContent = socket.recv(n - totalRecved)

print("onceContent", onceContent)

totalContent += onceContent

totalRecved = len(totalContent)

return totalContent

# data = sockfd.recv(30 * 1024 + 14)

data = RecvN(sockfd, 30 * 1024 + 14)

这样的话,就可以把我们所有需要接收的字长接收了。

文章的脚注信息由WordPress的wp-posturl插件自动生成

|2|left

打赏

TIM截图20170723221205.png

ico-wechat.jpg微信扫一扫,打赏作者吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值