2013-02-01 7 views
9

Ich befolge ein Tutorial http://www.raywenderlich.com/3932/how-to-create-a-socket-based-iphone-app-and-server zum Erstellen eines Beispiels mit Socket-Programmierung in Mac OS X Umgebung.Python twisted reactor - Adresse wird bereits verwendet

Ich schreibe mit post 80 für reactor.listenTCP (80, Fabrik). Wenn ich die server.py Datei ausführen, einen Fehler bekommen:

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. 

Quellcode ist wie folgt:

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() 

Wenn ich einen anderen Port nicht wie 6 usw. verwenden bin, funktioniert es gut . Ich wollte nur wissen, wie ich Port 80 für die gleiche Anwendung verwenden kann.

+1

Port 80 ist für das HTTP-Protokoll reserviert. Überprüfen Sie, ob auf diesem Port kein Prozess ausgeführt wird. Vielleicht ein HTTP-Server, wie Apache? –

Antwort

26

Öffnen Sie den Aktivitätsmonitor, suchen Sie nach Python und beenden Sie den Prozess. Sie haben es wahrscheinlich versäumt, einen Server einmal zu schließen.

3

Sie können den Port nicht abhören, wenn bereits eine andere Anwendung den Socket an diesen Port gebunden hat. Beispiel: socket.bind

5

Für mich war das Problem, dass Apache bereits auf Port lauscht 80. Scheint, wie viele Menschen mit diesem Thema durch diese Post und andere, die google, aber ich sehe nicht, diese besondere Antwort angeboten. Es war, was für mich arbeitete, also dachte ich, dass ich hinzufügen würde, wenn es hilft: laufenden Mac/Mavericks aber das Problem würde auf irgendeinem anderen System auftreten, in dem Apache standardmäßig läuft ... oder man könnte vergessen, dass es läuft.

Did

sudo lsof -i TCP:80 | grep LISTEN 

Got

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) 

tat
sudo apachectl stop 

Und der Server funktionierte gut auf Port 80 danach.

+0

Hier wird festgestellt, welche Prozesse zuhören. Dies ist die beste Antwort meiner Meinung nach. – mareoraft

7

Ich habe dieses Problem auch tatsächlich, gerade jetzt.

Hier ist, was ich getan habe:

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 

Dann alles gut geht.