Python Twisted反应器 - 地址已被使用

9 投票
4 回答
8439 浏览
提问于 2025-04-17 14:24

我正在跟着一个教程,想在Mac OS X环境下用socket编程做一个示例,教程地址是http://www.raywenderlich.com/3932/how-to-create-a-socket-based-iphone-app-and-server

我在用post 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端口。

4 个回答

6

对我来说,问题是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端口上就正常工作了。

7

我也遇到过这个问题,实际上,就是刚刚发生的。

这是我所做的:

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

然后一切就正常了。

26

打开活动监视器,搜索“Python”,然后结束这个进程。你可能之前关闭服务器的时候搞错了。

撰写回答