Python 在第一个字符后中断字符串
Python breaks string after first character
我的 Python 套接字程序在接收单行字符串时在第一个字符后中断。 socket程序运行在Raspberry Pi,客户端和Java。这是我的套接字代码
HOST = ''
PORT = 8888
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('Socket created')
try:
s.bind((HOST, PORT))
except socket.error as socketError:
print('socket binding failed, ', socketError)
print('Exiting...')
sys.exit(0)
print('Socket binding complete')
s.listen(1)
print('Socket listening for connection...')
conn, addr = s.accept()
print('connected to ',addr[0])
try:
while True:
data = conn.recv(1024).decode('utf-8')
print('value received',data)
except Exception as loopException:
print("Exception occurred in loop, exiting...",loopException)
finally:
s.close()
这就是我从 java
发送数据的方式
socket = new Socket(dstAddress, Integer.parseInt(dstPort));
os = new DataOutputStream(socket.getOutputStream());
os.writeBytes("Connection-Ready to receive commands");
这是我在终端中得到的
value received C
value received onnected-Ready to receive commands
有人知道为什么会这样吗?
套接字是字节流,不能保证 recv
将包含完整消息的所有字节。您有责任缓冲接收到的数据,直到收到完整的消息。
这也意味着您需要提供一种方法来了解您是否收到了完整的消息。在消息之前发送消息的长度,或阅读直到换行。
您需要循环读取,直到获得所有输入。您需要一种方法来了解您何时拥有所有输入。
如果客户端正在写入然后关闭套接字,那么您可以读取直到到达 EOF。如果客户端没有关闭套接字,那么您需要一些方法来知道要读取多少。最简单的事情是让客户端在发送字符之前发送一个长度字。你读了长度,然后读了那么多字符。
延迟是一种暂时可行的技巧,但并不可靠。如果您的网络速度变慢,您的代码可能会中断。
从您的输出来看,您似乎正在关闭客户端的流,尽管您没有显示这一点。因此,您只需要缓冲所有数据,直到到达流的末尾。这应该有效:
buffer = b''
try:
while True:
data = conn.recv(1024)
if not data:
break
buffer += data
except Exception as loopException:
print("Exception occurred in loop, exiting...", loopException)
finally:
s.close()
print('value received', buffer.decode('utf-8'))
我认为这会奏效。我没有连接来尝试它,但我的 IDE 喜欢它。我不太熟悉 Python 3 字节流。如果这不太奏效,无论如何你应该在这里明白这个想法。
我的 Python 套接字程序在接收单行字符串时在第一个字符后中断。 socket程序运行在Raspberry Pi,客户端和Java。这是我的套接字代码
HOST = ''
PORT = 8888
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('Socket created')
try:
s.bind((HOST, PORT))
except socket.error as socketError:
print('socket binding failed, ', socketError)
print('Exiting...')
sys.exit(0)
print('Socket binding complete')
s.listen(1)
print('Socket listening for connection...')
conn, addr = s.accept()
print('connected to ',addr[0])
try:
while True:
data = conn.recv(1024).decode('utf-8')
print('value received',data)
except Exception as loopException:
print("Exception occurred in loop, exiting...",loopException)
finally:
s.close()
这就是我从 java
发送数据的方式socket = new Socket(dstAddress, Integer.parseInt(dstPort));
os = new DataOutputStream(socket.getOutputStream());
os.writeBytes("Connection-Ready to receive commands");
这是我在终端中得到的
value received C
value received onnected-Ready to receive commands
有人知道为什么会这样吗?
套接字是字节流,不能保证 recv
将包含完整消息的所有字节。您有责任缓冲接收到的数据,直到收到完整的消息。
这也意味着您需要提供一种方法来了解您是否收到了完整的消息。在消息之前发送消息的长度,或阅读直到换行。
您需要循环读取,直到获得所有输入。您需要一种方法来了解您何时拥有所有输入。
如果客户端正在写入然后关闭套接字,那么您可以读取直到到达 EOF。如果客户端没有关闭套接字,那么您需要一些方法来知道要读取多少。最简单的事情是让客户端在发送字符之前发送一个长度字。你读了长度,然后读了那么多字符。
延迟是一种暂时可行的技巧,但并不可靠。如果您的网络速度变慢,您的代码可能会中断。
从您的输出来看,您似乎正在关闭客户端的流,尽管您没有显示这一点。因此,您只需要缓冲所有数据,直到到达流的末尾。这应该有效:
buffer = b''
try:
while True:
data = conn.recv(1024)
if not data:
break
buffer += data
except Exception as loopException:
print("Exception occurred in loop, exiting...", loopException)
finally:
s.close()
print('value received', buffer.decode('utf-8'))
我认为这会奏效。我没有连接来尝试它,但我的 IDE 喜欢它。我不太熟悉 Python 3 字节流。如果这不太奏效,无论如何你应该在这里明白这个想法。