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

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

python -m SimpleHTTPServer

但这给了我错误:

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

我以前使用相同的命令打开了一个连接 在我的电脑里的不同位置的一个不同的网站。


当前回答

您可以使用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()

其他回答

补充迈克尔·施密德的答案 刚刚遇到了一个问题,为了允许重新绑定端口,需要像这样子类化套接字服务器:

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或任何您正在使用的东西。

Use

 sudo lsof -i:5000

这将为您提供使用该端口的进程列表(如果有的话)。 一旦给出了进程列表,使用PID列上的id终止进程使用

 kill 379 #use the provided PID

简单的解决方案:

查找使用端口8080的进程:

sudo lsof -i:8080

终止该端口上的进程:

kill $PID

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

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

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

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

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

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