【问题标题】:Python twisted reactor - address already in usePython 扭曲反应器 - 地址已在使用中
【发布时间】:2013-01-16 10:27:14
【问题描述】:

我正在关注http://www.raywenderlich.com/3932/how-to-create-a-socket-based-iphone-app-and-server 的教程,用于在 Mac OS X 环境中使用套接字编程创建示例。

我正在使用 80 后的 reactor.listenTCP(80, factory) 进行写作。 当我运行 server.py 文件时,出现错误:

File "server.py", line 10, in <module>
    reactor.listenTCP(6, factory)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/twisted/internet/posixbase.py", line 436, in listenTCP
    p.startListening()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/twisted/internet/tcp.py", line 641, in startListening
    raise CannotListenError, (self.interface, self.port, le)
twisted.internet.error.CannotListenError: Couldn't listen on any:80: [Errno 48] Address already in use.

源码如下:

from twisted.internet.protocol import Factory, Protocol
from twisted.internet import reactor

class IphoneChat(Protocol):
    def connectionMade(self):
        self.factory.clients.append(self)
        print "clients are ", self.factory.clients

    def connectionLost(self, reason):
        self.factory.clients.remove(self)

factory = Factory()
factory.protocol = IphoneChat
factory.clients = []
reactor.listenTCP(80, factory)
print "Iphone Chat server started"
reactor.run()

如果我使用另一个端口,例如 6 等,它工作正常。 我只是想知道,如何将端口 80 用于同一个应用程序。

【问题讨论】:

  • 端口 80 为 HTTP 协议保留。检查是否没有进程在此端口上运行。也许是一些 HTTP 服务器,比如 apache?

标签: python macos sockets twisted


【解决方案1】:

打开活动监视器,搜索 Python 并终止进程。您可能搞砸了一次关闭服务器。

【讨论】:

    【解决方案2】:

    我也遇到了这个问题,其实,刚刚。

    这是我所做的:

    MacBook-Air:Desktop user$ sudo lsof -i:80
    COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
    Python  1276 root    3u  IPv4 ******      0t0  TCP *:http (LISTEN)
    MacBook-Air:Desktop user$ sudo kill 1276
    MacBook-Air:Desktop user$ sudo python server.py 
    Iphone Chat server started
    

    然后一切顺利。

    【讨论】:

      【解决方案3】:

      对我来说,问题是 apache 已经在侦听端口 80。似乎很多人通过这篇文章和其他有这个问题的人在谷歌上搜索,但我没有看到这个特定的答案。这对我有用,所以我想我会添加它以防万一它有帮助: 正在运行 Mac/Mavericks,但在默认运行 Apache 的任何其他系统上都会出现此问题......或者人们可能会忘记它正在运行。

      做过

      sudo lsof -i TCP:80 | grep LISTEN
      

      知道了

      httpd      20 root    4u  IPv6 0x1d12a12e12345b12      0t0  TCP *:http (LISTEN)
      httpd     109 _www    4u  IPv6 0x1d12a12e12345b12      0t0  TCP *:http (LISTEN)
      httpd     437 _www    4u  IPv6 0x1d12a12e12345b12      0t0  TCP *:http (LISTEN)
      httpd     438 _www    4u  IPv6 0x1d12a12e12345b12      0t0  TCP *:http (LISTEN)
      httpd     439 _www    4u  IPv6 0x1d12a12e12345b12      0t0  TCP *:http (LISTEN)
      

      做了

      sudo apachectl stop
      

      然后服务器在端口 80 上工作得很好。

      【讨论】:

      • 这会找到正在监听的进程。这是最好的答案恕我直言。
      【解决方案4】:

      如果另一个应用程序已经将套接字绑定到此端口,您将无法侦听该端口。例如阅读socket.bind

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多