1 回答
TA贡献1794条经验 获得超8个赞
当您使用PrintWriter.write(int c)方法时,您基本上将整数转换为字符,并且当服务器接收输入时,它会接收文本。
来自 PrintWriter 类文档:
将对象的格式化表示打印到文本输出流。此类实现了 PrintStream 中的所有打印方法。它不包含写入原始字节的方法,程序应使用未编码的字节流。
如果您想要更好的方法,请这样做。如果您想放弃 PrintWriter 并将纯整数发送到您的服务器,您可以这样做:
在您的 Java 客户端上:
使用 Socket 的OutputStream.write(byte b[])方法并传递您的 int 。整数通常由 4 个字节组成。使用此方法时,您将 4 个字节发送到 python 服务器。
outputStream.write(ByteBuffer.allocate(4).putInt(yourIntHere).array());
在你的 Python 服务器上:
from struct import unpack
# put this in your socket while True loop
my_bytes = client_socket.recv(4)
my_int = unpack('>I', my_bytes)[0]
所以基本上每次你的 Socket 客户端发送 4 个字节的整数时,你的服务器必须正好接收到 4 个字节,因为这是整数长度。最后 unpack() 方法将字节转换为 int。
不推荐: 如果您仍然想使用 PrintWriter,请使用PrintWriter.write(String s)方法将 int 作为 String 发送(确保首先将 int 转换为 String)。然后在你的 python 服务器上通过简单地使用将 str 转换为 int
int(data.decode('utf-8'))
尽管这不是将整数发送到后端的最佳方式,但它仍然有效,但如果您不知道客户端发送了多少字节,则极容易出错。问题是,当你说recv(1024)你的服务器可能会同时获得多个输入时。在您的情况下,您在发送数据后立即关闭套接字,所以您会没事,但如果您打算维持一个来回发送数据的连接而不关闭连接,那么这将是一个问题。例如,当您的客户端发送一个编码为文本的整数时,您的服务器可能最终会一次以字符串形式获取多个输入,而"102030"实际上10, 20, 30应该将其分开,并且您将不会获得预期的结果。您确实需要知道客户端发送了多少字节以防止这种情况发生。为了防止这种情况,您可以做的另一件事是在它们前面添加一些字符,以便您的客户端发送"-10", "-20", "-30"并服务器接收"-10-20-30",然后使用"-10-20-30".split('-')python 函数相应地解析它们。
添加回答
举报