gpt4 book ai didi

java - 来自 Java 客户端的 Python 套接字接收

转载 作者:太空狗 更新时间:2023-10-30 02:48:42 24 4
gpt4 key购买 nike

我有一个简单的 python tcp 服务器 (我正在使用 SocketServer 类) 的问题,它必须从 java 客户端接收数据。

这里是服务器端代码:

class ServerRequestHandler(SocketServer.BaseRequestHandler):
[...]
def handle(self):
requestCode = struct.unpack('>i', self.request.recv(4))[0]
[...]
[...]

这是客户端:

addr = InetAddress.getByName(hostname);
SocketAddress sockaddr = new InetSocketAddress(addr, port);
clientSocket = new Socket();
clientSocket.connect(sockaddr, timeoutMs);
clientSocketDataOutputStream = new DataOutputStream(clientSocket.getOutputStream());
int requestCode = 1;
clientSocketDataOutputStream.writeInt(requestCode);
clientSocketDataOutputStream.flush();

我启动 Python 服务器,然后尝试执行必须向服务器发送整数的客户端。

在服务器端 Python 引发异常,因为 recv(4) 函数没有读取 4 个字节,它只返回一个字节。

事实上,我的 Java 客户端正确发送了 4 个字节,如果我尝试调用 recv(1) 4 次,它会正确读取 4 个字节。

我尝试编写一个 Python 客户端来执行与我的 java 客户端相同的操作,在这种情况下,服务器的 recv(4) 运行良好。

如何解决这个问题?我想实现一个简单的 python 缓冲读取器函数,它逐字节读取套接字,但我确信存在更智能的解决方案。

最佳答案

recv 不必读取 4 个字节,它只抓取最多四个字节的内容。因为,正如您所说,您可以调用 recv(1) 4 次。你可以做到这一点

def recvall(sock, size):
msg = ''
while len(msg) < size:
part = sock.recv(size-len(msg))
if part == '':
break # the connection is closed
msg += part
return msg

这将在 sock 上重复调用 recv 直到接收到 size 字节。如果 part == '' 套接字关闭,那么它将返回关闭之前的所有内容

所以改变

requestCode = struct.unpack('>i', self.request.recv(4))[0]

requestCode = struct.unpack('>i', recvall(self.request, 4))[0]

我建议让 recvall 成为你的类的一个方法,让事情变得更干净。


这是对此处定义的安全套接字类的方法的修改:http://docs.python.org/howto/sockets.html

关于java - 来自 Java 客户端的 Python 套接字接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11871712/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com