python套接字连接无法接收完整消息
python socket connection fail to receive full message
我使用以下代码接收数据并转储到文件中。但是当发送的字符超过 1500 个时,它无法接收到完整的消息,因此 json 在文件中是不正确的。这种情况不一致地发生,即有时会收到完整的消息,有时会失败。
但是如果我们同时使用 logstash 作为接收者,这个问题就不会发生。
接收脚本:
s.listen(5)
while True:
c, addr = s.accept()
print('Got connection from', addr)
json_data = c.recv(16384).decode() # Increasing this doesn't help
json_dump = json.dumps(json_data)
if os.path.exists(destination_file):
append_write = 'a' # append if already exists
else:
append_write = 'w' # make a new file if not
dump_file = open(destination_file, append_write)
dump_file.write(json_dump + '\n')
dump_file.close()
c.send(b'SUCCESS')
c.close()
发件人脚本
def send_data(socket_conn, data_stream):
try:
json_data = JSONEncoder().encode(data_stream)
json_data = json_data
socket_conn.send(json_data.encode())
socket_conn.send(b'\n')
socket_conn.close()
return True
except socket.error as msg:
logging.error(msg, exc_info=True)
return False
json_data = c.recv(16384).decode() # Increasing this doesn't help
TCP 是流协议而不是消息协议。无法保证如果发送方使用单个 send
发送所有数据,则可以使用单个 recv
接收它们。
如果对方只发送一个 JSON 然后关闭连接,接收者可能只是 recv
直到没有更多数据可用(recv
returns 空消息)并连接各部分:
data = b''
while True:
buf = c.recv(16384)
if not buf:
break
data = data + buf
json_data = data.decode()
如果对等方正在发送多个 "messages" 那么在应用程序级别必须有一些消息指示符,例如为每条消息加上长度前缀(就像在 TLS 中所做的那样),每条消息以换行符结尾(就像在 SMTP 中完成的那样)或类似的。然后接收方需要根据消息格式读取数据,比如先读取长度,再读取给定的字节数。
我使用以下代码接收数据并转储到文件中。但是当发送的字符超过 1500 个时,它无法接收到完整的消息,因此 json 在文件中是不正确的。这种情况不一致地发生,即有时会收到完整的消息,有时会失败。
但是如果我们同时使用 logstash 作为接收者,这个问题就不会发生。
接收脚本:
s.listen(5)
while True:
c, addr = s.accept()
print('Got connection from', addr)
json_data = c.recv(16384).decode() # Increasing this doesn't help
json_dump = json.dumps(json_data)
if os.path.exists(destination_file):
append_write = 'a' # append if already exists
else:
append_write = 'w' # make a new file if not
dump_file = open(destination_file, append_write)
dump_file.write(json_dump + '\n')
dump_file.close()
c.send(b'SUCCESS')
c.close()
发件人脚本
def send_data(socket_conn, data_stream):
try:
json_data = JSONEncoder().encode(data_stream)
json_data = json_data
socket_conn.send(json_data.encode())
socket_conn.send(b'\n')
socket_conn.close()
return True
except socket.error as msg:
logging.error(msg, exc_info=True)
return False
json_data = c.recv(16384).decode() # Increasing this doesn't help
TCP 是流协议而不是消息协议。无法保证如果发送方使用单个 send
发送所有数据,则可以使用单个 recv
接收它们。
如果对方只发送一个 JSON 然后关闭连接,接收者可能只是 recv
直到没有更多数据可用(recv
returns 空消息)并连接各部分:
data = b''
while True:
buf = c.recv(16384)
if not buf:
break
data = data + buf
json_data = data.decode()
如果对等方正在发送多个 "messages" 那么在应用程序级别必须有一些消息指示符,例如为每条消息加上长度前缀(就像在 TLS 中所做的那样),每条消息以换行符结尾(就像在 SMTP 中完成的那样)或类似的。然后接收方需要根据消息格式读取数据,比如先读取长度,再读取给定的字节数。