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为缓冲区大小。
[email protected]:~# 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),然后将收到的数据拼接成完整的数据包后再解析。
时间: 2024-10-07 11:26:13