我有一个简单的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脚本端而不是服务器端,但是无法弄清楚它是什么。任何建议将不胜感激,谢谢:)