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

标签 python python-3.5 serversocket

我的 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

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

最佳答案

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

如果客户端正在写入然后关闭套接字,那么您可以读取直到到达 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 在第一个字符后中断字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55922194/

相关文章:

python - flask 'hello world' 不工作

Java - 套接字编程 - 如何使客户端从多个服务器接收消息?

python - Ansible mysql_user 与 Percona 57 和 RHEL7

python - 如何更改元组列表的某些值?

python - python中递归遍历列表

java - java代码设置日期和时间的问题

java - ServerSocket.accept() 终止 Android 应用程序

python - PyGame 在 macOS 上比在 Ubuntu 或 Raspbian 上慢

python - 如何使用 keras imagedatagenerator 为unet加载图像和掩码