如果端口已经被监听,如何让 Bottle return 出错?

How to make Bottle return an error if a port is already being listened to?

我的工作基于 Bottle 的 "Hello World" 示例,可在此处找到: https://bottlepy.org/docs/dev/tutorial.html

from bottle import Bottle, run

app = Bottle()

@app.route('/hello')
def hello():
    return "Hello World!"

run(app, host='localhost', port=8080)

我的问题是这段代码可以 运行 多次,然后只有第一个实例才是实际执行服务的那个。是否可以让程序return报错表明端口已经被监听?

在 运行 您的 bottle 应用程序可能有用之前,快速而粗略地检查端口是否打开。

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    s.bind(("127.0.0.1", 8000))
s.close()

上面的代码将尝试绑定到本地主机上的套接字 8000,如果套接字已在使用中,将失败并返回 48 错误 Address already in use。如果成功,它将关闭(解除绑定)端口 8000。

先选择一个空闲端口:

s.bind("127.0.0.1", 0)
free_port = sock.getsockname()[1]
s.close()

这很容易出现竞争条件,但与先绑定到 8000 然后关闭相比,它不太可能命中。

刚抓到错误:

try:
    run(app, host='localhost', port=8080)

except Exception as exc:
    print 'run exited: {}'.format(exc)

运行 当端口已经绑定时会产生

> python test.py
Bottle v0.12.8 server starting up (using WSGIRefServer())...
Listening on http://localhost:8080/
Hit Ctrl-C to quit.

run exited: [Errno 48] Address already in use

虽然我承认我不清楚为什么你要自己打印错误,而你已经得到的堆栈跟踪基本上做同样的事情。无论如何,以上内容应该有效。希望对您有所帮助!