Python twisted reactor - 已经在使用的地址

时间:2013-02-01 06:06:14

标签: python macos sockets twisted

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

我正在使用post 80 for 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 个答案:

答案 0 :(得分:26)

打开Activity Monitor,搜索Python并终止进程。你可能搞砸了一次关闭服务器。

答案 1 :(得分: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

然后一切顺利。

答案 2 :(得分:5)

对我来说,问题是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上工作得很好。

答案 3 :(得分:3)

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