Python3的tcp socket接收不定长数据包接收到的数据不全。
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python3的tcp socket接收不定长数据包接收到的数据不全。,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2126字,纯文字阅读大概需要4分钟。
内容图文
![Python3的tcp socket接收不定长数据包接收到的数据不全。](/upload/InfoBanner/zyjiaocheng/1331/e367572a1fd840028dde78fe98e57265.jpg)
Python Socket API参考出处:http://blog.csdn.net/xiangpingli/article/details/47706707
使用socket.recv(pack_length)接收不定长的数据,如果数据包长度超过一定值,则接收的数据不全。
参照python3.4的文档可发现:
- socket. recv ( bufsize [, flags])
-
Receive data from the socket. The return value is a bytes object representing the data received. The maximum amount of data to be received at once is specified by bufsize.
上述的英文的大体意思为:从socket中接收数据。返回值是byts类型。接收的最大数量的byte为缓冲区大小。
root@iZ94nil6ddfZ:~# cat setsockopt_test.py #!/usr/bin/python import socket SEND_BUF_SIZE = 4096 # 发送缓冲区的大小 RECV_BUF_SIZE = 4096 # 接收缓冲区的大小 def modify_buff_size(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) bufsize = sock.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF) print "Buffer size [Before]: %d" %bufsize sock.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1) sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, SEND_BUF_SIZE) sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, RECV_BUF_SIZE) bufsize = sock.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF) print( "Buffer size [After]: %d" %bufsize) if __name__ == ‘__main__‘: modify_buff_size()
执行
bufsize = sock.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF)
得到电脑上的默认接收缓冲区的值为:8192
问题场景描述:
server端非Python实现的,client端是Python3实现的,通讯协议为自定义的格式,每次交互的数据包都是不定长的数据包。
从server端取数据,因为没有指定查询条件,返回的数据的数据量在1000条左右,每一条的数据都包含多个的整数型和字符串型,byte大小为:26782。
如果取得的数据量比较多,每一次的请求数据,client 的socket.recv(packet_size)会执行多次。
解决方案:
receiverBufsize = self._client_socket.getsockopt( socket.SOL_SOCKET, socket.SO_RCVBUF) data_body = None if receiverBufsize < pack_length: data_body = bytes() left_pack_length = pack_length while left_pack_length > 0: if left_pack_length > receiverBufsize: body_part =self._client_socket.recv(receiverBufsize) else: body_part =self._client_socket.recv(left_pack_length) data_body += body_part left_pack_length -= receiverBufsize else: data_body= self._client_socket.recv(pack_length)
个人注解:
Python的socket一次最多只能读出缓冲区的全部的数据,如果指定的数据包的大小大于缓冲区的大小,则读出的有效数据仅仅为缓冲区的数据。
如果能确定发送过来的数据大于缓冲区的大小,则需要多次:socket.recv(receiverBufsize),然后将收到的数据拼接成完整的数据包后再解析。
原文:http://www.cnblogs.com/ribavnu/p/4816919.html
内容总结
以上是互联网集市为您收集整理的Python3的tcp socket接收不定长数据包接收到的数据不全。全部内容,希望文章能够帮你解决Python3的tcp socket接收不定长数据包接收到的数据不全。所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。