Python 如何解决twisted.internet.error.CannotListen错误:无法侦听任何已在使用的:8081:[Errno 98]地址

Python 如何解决twisted.internet.error.CannotListen错误:无法侦听任何已在使用的:8081:[Errno 98]地址,python,html,twisted.internet,Python,Html,Twisted.internet,我有一个TwistedPython服务器,它运行在端口8080上,我编写了不同的API,它运行在这个服务器上。所以我希望所有这些API都在一个端口上运行,但是当我尝试使用相同的端口时,所有API都用于ex:8081,并使用python解释器同时运行。当时我收到以下错误:twisted.internet.error.cannotlisten错误:无法侦听任何已在使用的:8081:[Errno 98]地址。 因为我是twisted的新手,所以我对twisted不太了解,也没有关于twisted的适当

我有一个TwistedPython服务器,它运行在端口8080上,我编写了不同的API,它运行在这个服务器上。所以我希望所有这些API都在一个端口上运行,但是当我尝试使用相同的端口时,所有API都用于ex:8081,并使用python解释器同时运行。当时我收到以下错误:twisted.internet.error.cannotlisten错误:无法侦听任何已在使用的:8081:[Errno 98]地址。 因为我是twisted的新手,所以我对twisted不太了解,也没有关于twisted的适当文档。请有人指导我解决此错误:

以下是代码片段:

from twisted.internet import epollreactor

epollreactor.install()

from zope.interface import implements
from twisted.internet import reactor,interfaces
from functools import partial
from pymongo import Connection
import json
from bson.objectid import ObjectId
import server_1
import replacePlus_Space

global data, data_new, datadB, coll_auth, coll_person


class Login_user(server_1.HTTPEchoFactory):

    def __init__(self):
        server_1.HTTPEchoFactory.__init__(self,"testsite")
        server_1.HTTPEchoFactory.initResources(self)
        self.initResources()

    def initResources(self):
        print "in Login"
        self.responses["/login_user"] = partial(self.user_login)


    # To connect to DB and Check error cases and insert into mongoDB..!!!
    def user_login(self, client):
        # some functinality..!!!!

d = Login_user()

reactor.listenTCP(8081,d)

reactor.run()         
第二个代码段是:

from twisted.internet import epollreactor

epollreactor.install()

from zope.interface import implements
from twisted.internet import reactor,interfaces
from functools import partial
from pymongo import Connection
import json
from bson.objectid import ObjectId
import server_1
import replacePlus_Space

class AddFriendDB(server_1.HTTPEchoFactory):

    def __init__(self):
        server_1.HTTPEchoFactory.__init__(self,"testsite")
        server_1.HTTPEchoFactory.initResources(self)
        self.initResources()

    def initResources(self):
        print "in add friend"
        self.responses["/addFriend_DB"] = partial(self.addFriendDB)


    # To connect to DB and Check error cases and insert into mongoDB..!!!
    def addFriendDB(self, client):
        #some functionality here..!!!

d = AddFriendDB()

reactor.listenTCP(8081,d)

reactor.run()

只有一个进程可以在某个端口上侦听。如果启动进程1在端口8081上侦听,然后在同一端口上启动另一个进程,则会出现此错误

这是来自TCP堆栈的错误,而不是来自python或twisted

通过为每个进程选择不同的端口或创建一个分叉服务器来修复此问题。

翻译此问题 你问题中的许多细节没有意义,因此我将你的问题转化为:

我有一个TwistedPython独立程序,它运行在端口8080上,我还编写了一个不同的独立程序,它运行在这个服务器上。我希望两个程序都在一个端口号上运行。当我尝试对所有程序使用相同的端口时,例如:对两个程序都使用端口8081。我收到以下错误:twisted.internet.error.cannotlisten错误:无法侦听任何已在使用的:8081:[Errno 98]地址。因为我是twisted的新手,所以我对twisted了解不多,也没有关于twisted的适当文档。请有人指导我解决这个错误

Twisted有很多文档 你评论说:

[…]没有关于twisted的适当文档

这一说法显然是错误的

Twisted当然有适当的文档,与大多数框架相比,它有优秀的文档。仅举几个高质量文档来源:

戴夫·佩蒂科拉(Dave Peticola)的《克朗多》(krondo)——对twisted的精彩而深刻的介绍,首先解释twisted所基于的技术。如果你真的想了解twisted,这篇长篇的介绍就是开始 Twisted主要网站上的高质量和广泛文档 这个Twisted已经对源代码进行了很好的注释,并且出人意料地理解了源代码,如果上面的文档没有告诉您需要什么,请从代码中找出它。 什么原因导致地址已在使用 正如巴特·弗里德里克斯所言:


只有一个进程可以在某个端口上侦听。如果启动进程1在端口8081上侦听,然后在同一端口上启动另一个进程,则会出现此错误

这是来自TCP堆栈的错误,而不是来自python或twisted

这是跨所有操作系统或至少所有可以运行Python的基于进程的操作系统的TCP/IP堆栈的基本原理

错误是您的操作系统提醒您,当数据到达IP端口时,OS/IP堆栈被设计为仅转发到一个进程,该进程正在该端口上实现应用程序级协议。当第二个程序试图重新注册某个其他程序已注册的端口时,会发生此错误

一般的解决办法 遇到这样的端口重用问题时,您必须问问自己:

这两个程序是否运行相同的应用程序级协议? 如果它们是相同的协议,协议是否具有路由,以便为任何给定事务识别正确的子程序/例程? 这两个程序是否位于路由中的不同位置? 如果它们不是相同的协议,即一个是HTTP,另一个是FTP,或者它们是相同的协议,但它是一个没有路由的协议,即两个NTP实例,那么就没有简单的方法将它们混合在一起,因为您试图打破IP规则和应用程序协议实现的构建方式。唯一的解决方案是将一个或两个协议封装到一个公共协议中,该协议也具有应用程序级路由,即将FTP封装在HTTP中并使用URI进行路由

如果它们是相同的协议,并且该协议提供了每事务路由,即HTTP事务内部的URI,并且它们不在相同的路由位置,则有更简单的解决方案,即:

将两个应用程序合并为一个

如果它们是相同的可路由协议,但位于不同的位置,即HTTP协议,第一个程序的URI位于/login,第二个程序的URI位于/addfriend,那么拉出两个程序/进程的后路由逻辑并将它们合并到一个同时执行这两个功能的程序中应该很简单

前端带有重定向器的程序由于av工具,此解决方案仅适用于HTTP 生病的

如果有HTTP协议程序可以路由到不同的位置,但由于某些原因很难将逻辑合并在一起,即一个程序是用Java编写的,另一个是用Python编写的,那么您可以使用重定向器(如

在这种情况下,您使用重定向器的方式是在两个不同的未使用端口(即12001、12002)上运行两个应用程序,然后在您希望服务的端口上运行重定向器,并使用配置文件运行重定向器,该配置文件将通过SF:

代码示例 以下三个程序说明了将两个程序合并为一个程序的过程,因此可以从同一端口访问两组逻辑

两个独立的程序: 如果运行以下代码,将在localhost上启动web服务器:8081。如果您将web浏览器指向http://127.0.0.1:8081/blah 将显示blah页面

#!/usr/bin/python

from twisted.internet import defer, protocol, reactor # the reactor

from twisted.web.server import Site # make the webserver go
from twisted.web.resource import Resource

class BlahPage(Resource):
    idLeaf = True
    def render_GET(self, request):
        return "<html><body>Blah Page!</body></html>"

class ShutdownPage(Resource):
    def render_GET(self, request):
        reactor.stop()

webroot = Resource()
webroot.putChild("blah", BlahPage())
webroot.putChild("shutdown", ShutdownPage())

def main():
    # Register the webserver (TCP server) into twisted
    webfactory = Site(webroot)
    reactor.listenTCP(8081, webfactory)

    print ("Starting server")
    reactor.run()


if __name__ == '__main__':
  main()
#!/usr/bin/python

from twisted.internet import defer, protocol, reactor # the reactor

from twisted.web.server import Site # make the webserver go
from twisted.web.resource import Resource

class FooPage(Resource):
    idLeaf = True
    def render_GET(self, request):
        return "<html><body>Foo Page!</body></html>"

class ShutdownPage(Resource):
    def render_GET(self, request):
        reactor.stop()

webroot = Resource()
webroot.putChild("foo", FooPage())
webroot.putChild("shutdown", ShutdownPage())

def main():
    # Register the webserver (TCP server) into twisted
    webfactory = Site(webroot)
    reactor.listenTCP(8082, webfactory)

    print ("Starting server")
    reactor.run()


if __name__ == '__main__':
  main()
合并逻辑 此代码是前两个程序的合并,因为您可以看到,只需复制少量代码即可将上述两个程序粘合到一个允许访问的程序中http://127.0.0.1:8080/blah 和http://127.0.0.1:8080/blah.


你能告诉我如何创建一个分叉吗server@G-很抱歉,我不能用twisted或Python。你得自己研究一下好的。。。无论如何谢谢你:我已经用代码片段更新了这个问题。请帮帮我。提前谢谢。@G-Coder您的更新很有帮助,几小时后我会再看。我突然想到的一个问题是:什么是HTTPEchoFactory?我能找到的关于这个名字的唯一参考是twisted network programming essentials一书中的一些示例代码。您是否按照该指南创建了代码?HTTPEchoFactory是另一个.py文件中的一个类,该文件是我根据twisted.python文档编写的服务器代码。@G-Coder您可以添加您的HTTPEchoFactory代码或至少添加代码中没有该上下文的twisted调用/类吗?我无法建议一种混合您的方法code.HTTPEchoFactory代码与我的错误无关。所以这不是必需的。
#!/usr/bin/python

from twisted.internet import defer, protocol, reactor # the reactor

from twisted.web.server import Site # make the webserver go
from twisted.web.resource import Resource

class BlahPage(Resource):
    idLeaf = True
    def render_GET(self, request):
        return "<html><body>Blah Page!</body></html>"

class FooPage(Resource):
    idLeaf = True
    def render_GET(self, request):
        return "<html><body>Foo Page!</body></html>"

class ShutdownPage(Resource):
    def render_GET(self, request):
        reactor.stop()

webroot = Resource()
webroot.putChild("foo", FooPage())
webroot.putChild("blah", BlahPage())
webroot.putChild("shutdown", ShutdownPage())

def main():
    # Register the webserver (TCP server) into twisted
    webfactory = Site(webroot)
    reactor.listenTCP(8080, webfactory)

    print ("Starting server")
    reactor.run()


if __name__ == '__main__':
  main()