套接字。错误:[Errno 48]地址已被使用

我试图从mac终端设置一个python服务器。

我导航到文件夹位置使用:

python -m SimpleHTTPServer

但这给了我错误:

socket.error: [Errno 48] Address already in use

我之前使用相同的命令打开了一个连接

.

.

.
579003 次浏览

您已经有一个绑定到默认端口(8000)的进程。如果您之前已经运行了相同的模块,那么该进程很可能仍然绑定到端口。试着先找到另一个进程:

$ ps -fA | grep python
501 81651 12648   0  9:53PM ttys000    0:00.16 python -m SimpleHTTPServer

命令参数包括在内,因此如果有多个python进程处于活动状态,您可以发现正在运行SimpleHTTPServer的进程。你可能想测试http://localhost:8000/是否仍然显示本地文件的目录列表。

第二个数字是进程号;通过发送一个信号停止服务器:

kill 81651

这将发送一个标准的SIGTERM信号;如果进程没有响应,你可能不得不求助于更严格的方法,比如发送SIGKILL (kill -s KILL <pid>kill -9 <pid>)信号。看到维基百科获取更多信息

或者,在不同的端口上运行服务器,通过在命令行上指定替代端口:

$ python -m SimpleHTTPServer 8910
Serving HTTP on 0.0.0.0 port 8910 ...

然后以http://localhost:8910访问服务器;其中8910可以是1024及以上的任意数字,前提是端口尚未被占用。

你也可以服务于下一个最高的可用端口,在Python中这样做:

import SimpleHTTPServer
import SocketServer


Handler = SimpleHTTPServer.SimpleHTTPRequestHandler


port = 8000
while True:
try:
httpd = SocketServer.TCPServer(('', port), Handler)
print 'Serving on port', port
httpd.serve_forever()
except SocketServer.socket.error as exc:
if exc.args[0] != 48:
raise
print 'Port', port, 'already in use'
port += 1
else:
break

如果你需要为其他实用程序做同样的事情,作为bash脚本可能更方便:

#!/usr/bin/env bash


MIN_PORT=${1:-1025}
MAX_PORT=${2:-65535}


(netstat -atn | awk '{printf "%s\n%s\n", $4, $4}' | grep -oE '[0-9]*$'; seq "$MIN_PORT" "$MAX_PORT") | sort -R | head -n 1

将其设置为名为get-free-port的可执行文件,你可以这样做:

someprogram --port=$(get-free-port)

这不如原生Python方法可靠,因为bash脚本不会捕获端口——另一个进程可能会在您的进程之前捕获端口(竞态条件)——但在使用没有自己的重试方法的实用程序时,仍然可能足够有用。

简单的解决方案:

  1. 查找使用端口8080的进程:
sudo lsof -i:8080
  1. 终止该端口上的进程:
kill $PID


kill -9 $PID  //to forcefully kill the port

PID从步骤1的输出中获得。

顺便说一下,为了防止这种情况发生,在SimpleHTTPServer仍然正常运行时,只需在终端中按Ctrl+C。这将“正确地”停止服务器并释放端口,这样您就不必在重新启动服务器之前再次查找并杀死该进程。

(Mods:我确实试图把这条评论放在最好的答案上,但我没有足够的声誉。)

使用

 sudo lsof -i:5000
这将给你一个使用端口的进程列表(如果有的话)。 一旦给出了进程列表,使用PID列上的id终止进程use

 kill 379 #use the provided PID

我是Python的新手,但经过简单的研究后,我发现这是典型的套接字被绑定。碰巧该套接字仍在使用,您可能需要等待才能使用它。或者,你可以添加:

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

这将使端口在更短的时间内可用。在我的例子中,它几乎立即使端口可用。

以防上述解决方案不起作用:

  1. 获取进程正在侦听的端口:

    $ ps ax | grep python

  2. 终止进程

    $ kill PROCESS_NAME

我有一个树莓派,我使用python web服务器(使用Flask)。我已经尝试了上面的所有方法,唯一的解决方案是关闭终端(shell)并再次打开它。或者重新启动树莓派,因为没有任何东西可以停止web服务器…

简单的一行命令来摆脱它,在终端输入下面的命令,

ps -a

这将列出Python正在使用的所有进程,并在终端中键入下面的命令,

kill -9 (processID)

例如kill -9 33178

您可以允许服务器使用< >强allow_reuse_address < / >强重用地址。

服务器是否允许重用地址。它默认为False,并且可以在子类中设置来更改策略。

import SimpleHTTPServer, SocketServer
PORT = 8000
httpd = SocketServer.TCPServer(("", PORT), SimpleHTTPServer.SimpleHTTPRequestHandler)
httpd.allow_reuse_address = True
print "Serving at port", PORT
httpd.serve_forever()

对于任何开发人员来说,这都是常见的用例。

最好在您的本地系统中使用它。(所以最好把这个脚本保存在一个shell配置文件中,比如ksh/zsh或bash配置文件,这取决于用户的偏好)

function killport {
kill -9 `lsof -i tcp:"$1" | grep LISTEN | awk '{print $2}'`
}

用法:

killport port_number

例子:

killport 8080

迈克尔·施密德 只是有一个问题,允许重新绑定端口使用需要子类套接字服务器像这样:

from socketserver import TCPServer, BaseRequestHandler
from typing import Tuple, Callable
class MySockServer(TCPServer):
def __init__(self, server_address: Tuple[str, int], RequestHandlerClass: Callable[..., BaseRequestHandler]):
self.allow_reuse_address = True
super().__init__(server_address, RequestHandlerClass)

,因为在实例化之后,没有必要更改该标志。 然后使用它而不是TCPServer或任何您正在使用的

跟我来

这发生在我调试或运行服务器时,当完成时,我不是终止进程,而是断开连接它。

当我们试图在服务器仍在运行时关闭PyCharm时,PyCharm会请求这两个选项

这将导致进程仍然在该特定地址的后台运行,因此出现Address already in use错误。

解决方案

pkill python

对我有用。

另一种情况-多进程

如果你有多个运行python的服务器/应用程序(显然,在不同的端口😅),那么使用__ABC1和__ABC2获取该进程的PID

sudo lsof -i :5000 # here 5000 is the port number


| COMMAND | PID    | USER     | FD | TYPE | DEVICE | SIZE/OFF | NODE | NAME                    |
|---------|--------|----------|----|------|--------|----------|------|-------------------------|
| python  | 185339 | username | 7u | IPv4 | 598745 | 0t0      | TCP  | localhost:5000 (LISTEN) |
| python  | 185348 | username | 7u | IPv4 | 598745 | 0t0      | TCP  | localhost:5000 (LISTEN) |
| python  | 185350 | username | 8u | IPv4 | 598745 | 0t0      | TCP  | localhost:5000 (LISTEN) |




kill -9 185339 # here 185339 is the PID from above output; keep the -9 as it is

检查@Andrew的答案,以防止将来发生这种情况。

参考:杀戮指令杀死/ pkill / killalllsof

合十礼🙏

返回此错误是因为试图在项目仍在运行时重新运行该项目。停止并重新启动项目。