java客户端的Python套接字接收

2024-10-01 04:52:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个简单的pythontcp服务器上遇到了一个问题(我使用的是SocketServer类),它必须从java客户机接收数据。在

这里是服务器端代码:

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

这里是客户:

^{pr2}$

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

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

实际上,如果我尝试调用recv(1)4次,它会正确地读取4个字节,那么我的java客户机会正确地发送4个字节。在

我试图编写一个Python客户机来执行java客户机的相同操作,在本例中,服务器的recv(4)工作良好。在

如何解决这个问题?我想实现一个简单的python buffered reader function,它逐字节从套接字读取数据,但我确信存在一个更聪明的解决方案。在


Tags: 代码self服务器客户机客户字节服务器端java
3条回答

recv(4)将读取4个字节的最大。请参阅文档:http://docs.python.org/library/socket.html。我认为制作一个简单的缓冲读卡器函数是一个完全可以接受的解决方案。在

也许你可以使用io模块中的东西?^例如{a2}。在

recv不需要读取4个字节,它只需要获取最多4个字节的任何内容。因为,正如你所说,你可以打4次recv(1)。你能做到的

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 == ''套接字是关闭的,那么它将返回关闭之前的任何内容

所以改变

^{pr2}$

^{3}$

我建议您将recvall作为类的一个方法,以使事情更干净。在


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

相关问题 更多 >