Python 套接字接收 - 传入数据包始终具有不同的大小

2023-11-21

我正在使用 SocketServer 模块作为 TCP 服务器。 我在这里遇到一些问题recv()函数,因为传入数据包总是具有不同的大小,所以如果我指定recv(1024)(我尝试使用更大的值和更小的值),它会在 2 或 3 个请求后卡住,因为数据包长度会更小(我认为),然后服务器卡住直到超时。

class Test(SocketServer.BaseRequestHandler):

def handle(self):

   print "From:", self.client_address

   while True:    

     data = self.request.recv(1024)
     if not data: break

     if data[4] == "\x20":              
       self.request.sendall("hello")
     if data[4] == "\x21":
       self.request.sendall("bye")
     else:
       print "unknow packet"
   self.request.close()
   print "Disconnected", self.client_address

launch = SocketServer.ThreadingTCPServer(('', int(sys.argv[1])),Test)

launch.allow_reuse_address= True;

launch.serve_forever()

如果客户端通过同一源端口发送多个请求,但服务器卡住了,任何帮助将不胜感激,谢谢!


Larry Hastings 的回答对套接字提供了一些很好的一般性建议,但存在一些错误,因为它涉及如何recv(bufsize)方法在Python套接字模块中工作。

因此,澄清一下,因为这可能会让其他寻求帮助的人感到困惑:

  1. bufsize 参数为recv(bufsize)方法不是可选的。如果你调用,你会得到一个错误recv()(没有参数)。
  2. 缓冲区长度在recv(bufsize) is a maximum尺寸。如果可用字节数较少,recv 会很乐意返回较少的字节数。

See 文档了解详情。

现在,如果您正在从客户端接收数据并想知道何时收到所有数据,您可能必须将其添加到您的协议中 - 正如拉里建议的那样。看这个食谱用于确定消息结束的策略。

正如该食谱所指出的,对于某些协议,客户端在发送完数据后将简单地断开连接。在这些情况下,您的while True循环应该可以正常工作。如果客户这样做not断开连接,您需要找到某种方法来指示您的内容长度、分隔消息或实现超时。

如果您可以发布确切的客户端代码和测试协议的描述,我很乐意为您提供进一步的帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 套接字接收 - 传入数据包始终具有不同的大小 的相关文章

随机推荐