2010-10-12 8 views
2

Ceci est le code que j'ai joué, mais chaque fois que je fais une erreur, je ne peux pas le relancer. Il me dit que le port/socket est déjà utilisé C'est la première question Le second est dans mon MyTCPHandler comment puis-je savoir le port utilisé? voici mon code:python SocketServer.BaseRequestHandler connaître le port et utiliser le port déjà ouvert

# MetaProject v 0.2 
# -*- coding: utf-8 -*- 
""" 
Thanks to : 
People from irc : 
Flox,Luyt 
People from stack Overflow : 
Philippe Leybaert,Platinum Azure,methodin,Suresh Kumar,S.Lott,MatTheCat, 
kevpie,Ignacio Vazquez-Abrams,adamk,Frédéric Hamidi,THC4k,THC4k,Blam 
""" 
import SocketServer 
import threading 

class MyTCPHandler(SocketServer.BaseRequestHandler): 
    def handle(self): 
     self.data = self.request.recv(1024) 
     socket = self.request 
     print "%s wrote:" % self.client_address[0] 
     print self.data 
     print self.__dict__ 
     socket.sendto(self.data.upper(), self.client_address) 


def serve_thread(host, port): 
    server = SocketServer.TCPServer((host, port), MyTCPHandler) 
    server.serve_forever() 





if __name__ == "__main__": 
    threading.Thread(target=serve_thread,args=('localhost', 1238)).start() 
    threading.Thread(target=serve_thread,args=('localhost', 1237)).start() 
    print "toto" 

je l'ai fait:

def serve_thread(host, port): 
    if port == 1858 : 
     server = SocketServer.TCPServer((host, port), Serverhttp,bind_and_activate=True) 
    elif port == 1958 : 
     server = SocketServer.TCPServer((host, port), Serversmtp,bind_and_activate=True) 
    server.allow_reuse_address=True 
    server.serve_forever() 

mais il ne fonctionne pas. Cordialement

Répondre

3

Créez votre SocketServer avec bind_and_activate=True dans l'appel au constructeur.

Définissez ensuite server.allow_reuse_address=True.

Si vous souhaitez différencier les deux ports, vous pouvez utiliser deux classes différentes pour les gestionnaires de requêtes.

Modifier:

Modifier votre code pour ressembler à:

def serve_thread(host, port): 
    if port == 1858 : 
     server = SocketServer.TCPServer((host, port), Serverhttp,bind_and_activate=True) 
    elif port == 1958 : 
     server = SocketServer.TCPServer((host, port), Serversmtp,bind_and_activate=True) 
    server.allow_reuse_address=True 
    server.server_bind() 
    server.server_activate() 
    server.serve_forever() 

Il pourrait être plus propre à créer votre propre classe de serveur. Quelque chose comme ceci:

class ReuseAddrServer(SocketServer.TCPServer): 
    def __init__(self, (host, port)): 
     SocketServer.TCPServer.__init__(self, (host, port), bind_and_activate=False) 
     self.allow_reuse_address = True 
     self.server_bind() 
     self.server_activate() 
+0

pourriez-vous être un peu plus précis s'il vous plaît? – user462794

+0

pourriez-vous être un peu plus précis s'il vous plaît? Puis-je faire: def serve_thread (hôte, port): si port == 1858: serveur = SocketServer.TCPServer ((hôte, port), Serverhttp, bind_and_activate = True) elif port == 1958: serveur = SocketServer. TCPServer ((hôte, port), Serversmtp, bind_and_activate = True) server.allow_reuse_address = Vrai server.serve_forever() – user462794

+0

@ user462794: Qu'est-ce qui ne fonctionne pas? Vous avez marqué cette réponse comme acceptée, alors laissez-moi savoir si vous avez encore des problèmes. – bstpierre

10

Il est plus facile que cela - vous pouvez simplement définir comme une variable de classe, au lieu de remplacer initialisation. E.g.,

class MyServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): 
    allow_reuse_address = True 
Questions connexes