Python在第一个字符后中断字符串

时间:2019-04-30 13:38:36

标签: python python-3.5 serversocket

我的Python套接字程序在收到单个行字符串时在第一个字符之后中断。套接字程序在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

有人知道它为什么会这样吗?

2 个答案:

答案 0 :(得分:3)

您需要循环阅读,直到获得所有输入。您需要一种方法来知道何时拥有所有输入。

如果客户端正在编写然后关闭套接字,则可以阅读直到进入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字节流不那么熟悉。如果还不行,那么您还是应该在这里有了主意。

答案 1 :(得分:2)

套接字是字节流,不能保证recv将具有完整消息的所有字节。您有责任对收到的数据进行缓冲,直到收到完整的消息为止。

这还意味着您需要提供一种方法来知道您有完整的消息。在消息之前发送消息的长度,或阅读直到换行。