重新建立网络连接后Python的socket.recv的行为

2024-06-07 18:28:32 发布

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

我有一个简单的服务器客户端程序。服务器每秒向客户端发送一个字符串

import socket
import time

initialSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
initialSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
initialSocket.bind(('localhost', 12345))
initialSocket.listen()
rwSocket, address = initialSocket.accept()
initialSocket.close()

k = 1
while True:
    message = '[%d] Hi there!' % k
    rwSocket.sendall(message.encode('utf-8'))
    print(message)
    time.sleep(1)
    k += 1
rwSocket.close()

。。。当客户端只打印它接收到的内容时:

import socket

rwSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
rwSocket.connect(('localhost', 12345))

message = rwSocket.recv(1024)
while message:
    print(message.decode('utf-8'))
    message = rwSocket.recv(1024)

rwSocket.close()

一切正常,直到我发出sudo ifconfig lo down,等待一段时间,然后使用sudo ifconfig lo up重新建立连接。客户端的套接字最终会唤醒并再次开始接收消息(包括在失去连接期间丢失的所有消息),但这样做可能需要任意时间。这段时间似乎与连接中断的时间无关。例如,连接可能中断5秒钟,客户端的套接字需要一分钟才能唤醒,反之亦然

对此有什么办法吗?是否可以立即检测到连接的重新建立?客户端是否可以在重新建立连接后清除管道,以避免丢失的消息充斥其中?任何帮助都将不胜感激


Tags: import服务器localhost消息客户端messageclosestream

热门问题