1

我正在尝试使用 twisted 运行 klein,因此我可以在不同的路径(exp: example.com/example1, example.com/example2)上运行 twisted 脚本。所以我做了一个简单的脚本:

from klein import run, route, Klein
from twisted.internet import reactor
from twisted.web import proxy, server
from twisted.python import log

@route('/example')
def home(request):
    site = server.Site(proxy.ReverseProxyResource('www.example.com', 80, b''))
    reactor.listenTCP(80, site)
    reactor.run()

run("My_IP_Address", 80)

但是每当我运行这个脚本时,我都会收到一个错误:twisted.internet.error.CannotListenError: Couldn't listen on any:80: [Errno 98] Address already in use.我对 Klein 很陌生,我不确定它是如何工作的,有人能告诉我我做错了什么吗?谢谢!

4

1 回答 1

2

你得到的这个例外似乎很清楚,它说:

Couldn't listen on any:80: [Errno 98] Address already in use.

当您尝试使用的端口号已被其他一些服务使用时,就会发生这种情况。该其他服务可以是 Twisted 以外的其他服务,也可以是两个 Twisted 服务。我将假设您没有在端口 80 上侦听任何其他内容(例如 nginx 或 apache 或其他一些 Web 服务器,请注意 80 是默认 HTTP 端口,因此可以在那里侦听许多服务)并且您的问题是由启动两个引起的扭曲的网络服务。

在您的情况下,您正在尝试启动两个在一个端口上侦听的服务。

run("My_IP_Address", 80)

启动一项侦听端口 80 的服务。

在 /example 路由上收到请求后,您尝试在同一端口上启动另一个服务:

site = server.Site(proxy.ReverseProxyResource('www.example.com', 80, b''))
reactor.listenTCP(80, site)
reactor.run()

这没有逻辑意义,你不能在同一个端口上运行两个服务。这就是你得到这个异常的原因。您对 reactor.run() 的调用也是无用的,从 klein 导入的 run() 已经启动了反应器。

如果您确实需要在某个请求后启动某个服务器(这似乎是非常不寻常的用例),请在不同的端口上启动它。但也许您应该从那里的官方文档和示例开始?

于 2016-05-04T07:19:11.640 回答