我正在使用 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套接字模块中工作。
因此,澄清一下,因为这可能会让其他寻求帮助的人感到困惑:
- bufsize 参数为
recv(bufsize)
方法不是可选的。如果你调用,你会得到一个错误recv()
(没有参数)。
- 缓冲区长度在
recv(bufsize)
is a maximum尺寸。如果可用字节数较少,recv 会很乐意返回较少的字节数。
See 文档了解详情。
现在,如果您正在从客户端接收数据并想知道何时收到所有数据,您可能必须将其添加到您的协议中 - 正如拉里建议的那样。看这个食谱用于确定消息结束的策略。
正如该食谱所指出的,对于某些协议,客户端在发送完数据后将简单地断开连接。在这些情况下,您的while True
循环应该可以正常工作。如果客户这样做not断开连接,您需要找到某种方法来指示您的内容长度、分隔消息或实现超时。
如果您可以发布确切的客户端代码和测试协议的描述,我很乐意为您提供进一步的帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)