Python中的“ socket.error:[Errno 48]地址已在使用中”

问题描述

我正在遵循this套接字上的教程,并且情况一直很好,直到老师在34分44秒处再次在文本编辑器中运行该程序。最后,我收到一条错误消息,内容为: socket.error:[Errno 48]地址已在使用。我正在使用Macbook,并且我的文本编辑器是Atom。如果能解决或解决此错误,我将为您提供帮助!

跟踪

Traceback (most recent call last):
  File "/Users/lyons/Documents/sockets/server.py",line 16,in <module>
    server.bind(ADDR)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py",line 228,in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 48] Address already in use
[Finished in 0.393s]

server.py

import socket
import threading

HEADER = 64
PORT = 5050
                                                                                                       
SERVER = socket.gethostbyname(socket.gethostname()) 
ADDR = (SERVER,PORT)
FORMAT = 'utf-8'
DISCONNECT_MESSAGE = "!DISCONNECT"

server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(ADDR)

def handle_client(conn,addr):
    print("[NEW CONNECTION] {addr} connected.")
    connected = True
    while connected:
        msg_length = conn.recv(HEADER).decode(FORMAT)       
        msg_length = int(msg_length)
        msg = conn.recv(msg_length).decode(FORMAT)
        if msg == DISCONNECT_MESSAGE:
            connected = False
        print("[{}] {}".format(addr,msg))
    conn.close()

def start():
    server.listen()
    print("[LISTENING] Server is listening on {}".format(SERVER))
    while True:
        conn,addr = server.accept()    # BLOCKING LINE OF CODE
        thread = threading.Thread(target=handle_client,args=(conn,addr))
        thread.start()
        print("[ACTIVE CONNECTIONS] {threading.activeCount() - 1}")

print("[STARTING] server is starting...")
start()

client.py

import socket

HEADER = 64
PORT = 5050

FORMAT = 'utf-8'
DISCONNECT_MESSAGE = "!DISCONNECT"
SERVER = socket.gethostbyname(socket.gethostname())
ADDR = (SERVER,PORT)

client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(ADDR)

解决方法

一个明显的原因是,如果您已经有一个正在运行的服务器实例。

更棘手的情况是当连接以“肮脏”的方式关闭时。此"quarantines"地址需要一段时间,然后才能再次使用。您可以通过setting the SO_REUSEADDR flag在套接字上解决此问题。

编辑:here's some more reading,但不在SO上。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...