【发布时间】:2019-09-15 22:20:06
【问题描述】:
我正在用 python 编写一个多处理服务器来接收来自多个客户端的数据。建立新连接后,首先数据传输正常。创建一个新进程来接收和处理数据流。如果客户端主动断开与服务器的连接,则关闭套接字并终止进程。
到目前为止一切正常。但是,当数据传输暂停一段时间后,recv() 函数似乎已关闭,无法再接收新数据。但是,根据 recv() 的返回值,连接似乎很好。尽管该进程仍然存在,但客户端必须重新连接服务器,这使得服务器为其创建一个新进程。
这是我服务器的主要代码:
def main():
with socket(AF_INET, SOCK_STREAM) as s:
s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
address = ('', 7788)
s.bind(address)
s.listen()
while True:
print('WAITING FOR CONNECTIONS...')
newConn, newAddr = s.accept()
with newConn:
print('%s CLIENT ACCEPTED...' % newAddr[0])
p = Process(target=recv, args=(newConn, newAddr))
p.start()
def recv(newConn, newAddr):
while True:
recvData = newConn.recv(1024)
if len(recvData) > 0:
dataprocessing(recvData)
else:
print('%s CLIENT DISCONNECTED' % newAddr[0])
break
我希望每个连接都能尽可能长地保持活动状态,以便随时接收来自客户端的新数据。为什么我的服务器不能正常工作?值得注意的是,当连接似乎死了,它既没有得到新的数据来处理,也没有打印出“CONNECTION DISCONNECTED”信息。这是为什么呢?
【问题讨论】:
-
是什么导致数据传输暂停一段时间?是因为客户端决定停止发送一段时间,还是由于丢包/硬件问题(例如,有人暂时断开了以太网电缆)?在后一种情况下,TCP 层将检测到丢失的数据包并假设网络拥塞过多,并减慢 TCP 连接的传输速率以进行补偿——有时使其变得如此缓慢以至于它似乎被停止了(尽管它最终会恢复并再次加速,有时在数据包停止丢弃后)
-
数据传输暂停是由于客户端发送数据中断。在我的情况下,套接字处于阻塞模式(默认)。
-
你不能让它活着。你只能避免关闭它。如果它失败了,你必须关闭它,读取超时是防止网络故障和恶意客户端的基本防御。
标签: python sockets networking server