python套接字在收到大数据后无法发送数据

时间:2016-12-08 01:43:47

标签: python sockets

我有一个简单的python脚本作为套接字服务器。

我使用此脚本连接java服务器并以protobuffer格式发送/ recv数据。

# socket_client.py

client_socket = None
ADDRESS = "x.x.x.x"
PORT = xxxx

def connect(address, port):
    global client_socket
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect((address, port))
    client_socket.setblocking(True)

当使用按键时,脚本将调用request方法向服务器发送消息,然后等待结果,然后将结果返回给用户:

def recv_timeout(the_socket, pack_len, timeout = 8):
    to_read = pack_len
    total_data = []; data = ''; begin = time.time()
    while 1:
        if total_data and time.time() - begin > timeout:
            break
        elif time.time() - begin > timeout * 2:
            break
        try:
            data = the_socket.recv(pack_len)
            if data:
                to_read -= len(data)
                total_data.append(data)
                begin = time.time()
                if to_read <= 0:
                    break
            else:
                time.sleep(0.1)
        except:
            pass
    return ''.join(total_data)

def request(message):
    global client_socket

    # ......
    send_data = data_util.makeSendData(message)

    # send
    send_len = client_socket.send(send_data)
    print 'send_len: %d' % send_len

    # recv head for total length of the result
    pack_len = client_socket.recv(4)
    pack_len = struct.unpack('!i', pack_len)[0]
    print 'pack_len: %d' % pack_len

    # recv all
    recv_data = recv_timeout(client_socket, pack_len)

    # ......

    return recv_data

当我尝试向服务器发送心跳消息时,这可以正常工作,我可以从服务器中恢复数据并成功解码消息。

日志的输出:

send_len: 31
pack_len: 27

然后我尝试发送消息(登录命令),服务器将向我返回大量数据:

send_len: 52
pack_len: 3494

第一次发送此命令时,它工作正常,服务器可以接收长度为52的消息,我可以从服务器接收长度为3494的所有数据,我可以成功解码包。

但是,问题是在收到带有大量返回数据的login命令的数据后,我再也无法发送任何命令了。

说,我尝试在登录命令后再次发送心跳命令,日志输出为:

send_len: 31

该行

client_socket.send(send_data)
调用

并返回与之前相同的结果,这似乎没问题。但是服务器根本没有显示传入命令,对于脚本,它在前一行被阻止:

pack_len = client_socket.recv(4)

我认为问题出在python脚本端而不是服务器端,但是无法弄清楚它是什么。任何建议将不胜感激,谢谢:)

0 个答案:

没有答案