首页 > 解决方案 > 每个请求两个连接

问题描述

对于以下代码,每次我连接到服务器时,我都会看到每个浏览器请求有两个连接。出了什么问题以及如何解决这个问题?

$ sudo python3 host.py 
Connected by ('127.0.0.1', 60810)
Connected by ('127.0.0.1', 60812)

浏览器:

http://localhost:65432/

主机.py:

#!/usr/bin/env python3

import socket

HOST = '127.0.0.1'  # Standard loopback interface address (localhost)
PORT = 65432        # Port to listen on (non-privileged ports are > 1023)

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    while True:
        conn, addr = s.accept()
        with conn:
            print('Connected by', addr)
            data = conn.recv(1024)
            conn.sendall(data)

此外,每次我按 ^C 并再次运行脚本时,我都会得到

Traceback (most recent call last):
  File "host.py", line 9, in <module>
    s.bind((HOST, PORT))
OSError: [Errno 98] Address already in use

一分钟,在此期间无法连接。它看起来像一个超时。

标签: pythonpython-3.xsockets

解决方案


您的浏览器尝试连接几次,这是您看到的两个连接。

拥有进程关闭后,系统将保持绑定端口打开一段时间。如果您在这段时间内尝试再次绑定到同一个端口,您将收到Address already in use。您可以设置SO_REUSEADDR标志以便能够立即重用端口:

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

sudo注意:只要您的端口号大于 1024,就不需要使用。


推荐阅读