我有一个Web代理,它启动一个TCP侦听器套接字,接受来自客户端的连接。监听器通过以下方式接受连接:
clientConnection, clientAddress = listenerSocket.accept()
然后一个新线程从那里处理客户端连接。
要模拟客户端连接,我使用telnet
连接到代理并发出命令。代理需要从telnet
接收数据,我需要确保收到所有数据。为实现这一目标,我正在做以下事情:
while True:
requestBytes = clientConnection.recv(1024)
if not requestBytes:
break
requestBuffer += requestBytes
代理然后对字节进行解码并用它们做一些花费一点时间的事情,然后必须将响应发送回同一个客户端。但是,当使用上面的代码时与clientConnection
的连接在我处理字节并响应之前很久就会关闭。
以下是我不理解的内容,当我使用以下内容时:
while True:
requestBytes = clientConnection.recv(1024)
requestBuffer += requestBytes
break
它工作正常,clientConnection
保持不变。如果我收到超过1024个字节,但clientConnection
不关闭,这显然有问题。
更具体地说,在我收到发送到客户端的响应并调用后发生错误:
clientConnection.sendall(response)
clientConnection.shutdown(1)
clientConnection.close()
第clientConnection.shutdown(1)
行会引发错误:
[Errno 107] Transport endpoint is not connected
这令人困惑,因为不知何故它仍能在前一行调用sendall
。 请注意,我实际上并没有在客户端收到任何内容。
我确信连接没有在代码中的其他位置关闭。这里究竟发生了什么,以及recvall
和这样做的最佳方式是什么?让clientConnection
保持开放状态?