我想关闭客户端连接在一个简单的客户端服务器聊天以正确的方式,而不超时连接关闭他们。不幸的是,客户端站点上的连接没有关闭。
服务器代码
import socket
import sys
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 65432)
sock.bind(server_address)
sock.listen(1)
while True:
connection, client_address = sock.accept()
try:
while True:
data = connection.recv(1024)
print(data)
if data:
connection.sendall(data)
else:
break
finally:
connection.close()客户代码
import socket
import time
HOST = '127.0.0.1'
PORT = 65432
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall(b'Hello world')
data = s.recv(1024)
print('Received', data)
time.sleep(5)
#s.sendall('Hello world, again'.encode())
s.close()启动服务器将导致:
tcp LISTEN 0 1 127.0.0.1:65432 0.0.0.0:* 在运行客户端之后,我期望相同的状态,但是客户端连接是打开的。
tcp LISTEN 0 1 127.0.0.1:65432 0.0.0.0:*
tcp TIME-WAIT 0 0 127.0.0.1:57794 127.0.0.1:65432但如果我取消评论如下:
#s.sendall('Hello world, again'.encode())结果如我所料。
tcp LISTEN 0 1 127.0.0.1:65432 0.0.0.0:* 为什么在没有第二次数据发送和超时的情况下立即关闭连接?
发布于 2019-05-23 20:31:11
TCP是一种可靠的协议。即使客户端发送数据并关闭连接,如果数据包需要重新传输,连接也要维护一段时间。几分钟后TIME_WAIT就会消失。有一个选项SO_LINGER可以控制超时。
https://stackoverflow.com/questions/56276130
复制相似问题