2012-05-07 9 views

उत्तर

7

वह स्रोत कोड देखने के बाद बाहर काम करने के लिए जल्दी था। सीधे स्रोत से जोड़ने के लिए दस्तावेज़ों के लिए धन्यवाद!

एक ExitNow अपवाद है जिसे आप आसानी से ऐप से उठा सकते हैं, जो लूप से बाहर निकलता है।

दस्तावेज़ों से EchoHandler उदाहरण का उपयोग करके, मैंने डेटा प्राप्त करते समय इसे तुरंत छोड़ने के लिए संशोधित किया है।

class EchoHandler(asyncore.dispatcher_with_send): 

    def handle_read(self): 
     data = self.recv(8192) 
     if data: 
      raise asyncore.ExitNow('Server is quitting!') 

इसके अलावा, ध्यान रखें कि आप पकड़ कर सकते हैं ExitNow इसलिए यदि आपका एप्लिकेशन उठाना नहीं है कि आप वह आंतरिक रूप से उपयोग कर रहे हैं में रहते हैं। यह मेरा कुछ स्रोत है:

def run(config): 
    instance = LockServer(config) 
    try: 
     asyncore.loop() 
    except asyncore.ExitNow, e: 
     print e 
5

एसिंककोर पाश भी छोड़ता है जब कोई कनेक्शन नहीं छोड़ा जाता है, तो आप कनेक्शन को बंद कर सकते हैं। यदि आपके पास एकाधिक कनेक्शन चल रहे हैं तो आप asyncore.close_all() का उपयोग कर सकते हैं।

4

एक और तरीका asyncore.loop कॉल के गिनती पैरामीटर का उपयोग करना है। इसके बाद आप अन्य तर्क में asyncore.loop लपेट कर सकते हैं:

while(i_should_continue()): 
    asyncore.loop(count=1) 

यह तुरंत एक खुले कनेक्शन, या समय से पहले का समय समाप्त नहीं रुकेगा। लेकिन यह शायद एक अच्छी बात है? जब मैं एक सुनवाई सर्वर शुरू करता हूं तो मैं इसका उपयोग कर रहा हूं।

+1

मर जाता है यह शायद उचित समाधान है यदि आप "लूप के बाहर" से पाश बंद करना चाहते हैं। उपरोक्त अन्य समाधान लूप के भीतर लूप को रोकने के लिए हैं। –

5

इस प्रयास करें:

सर्वर के लिए

एक वर्ग (asyncore.dispatcher फैली):

class Server(asyncore.dispatcher): 

    def __init__(self, port): 
     asyncore.dispatcher.__init__(self) 

     self.host = socket.gethostname() 
     self.port = port 

     self.create_socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.set_reuse_addr() 
     self.bind((self.host, self.port)) 
     self.listen(5) 
     print "[Server] Listening on {h}:{p}".format(h=self.host, p=self.port) 

    def handle_accept(self): 
     pair = self.accept() 
     if pair is not None: 
      sock, addr = pair 
      print "[ServerSocket] We got a connection from {a}".format(a=addr) 
      SocketHandler(sock) 

धागा जो सर्वर का प्रबंधन करने के लिए जा रहा है के लिए एक और वर्ग (फैली धागा) ... की जांच रन() विधि, वहाँ है जहाँ हम फोन asyncore.loop():

:

class ServerThread(threading.Thread): 
    def __init__(self, port): 
     threading.Thread.__init__(self) 
     self.server = Server(port) 

    def run(self): 
     asyncore.loop() 

    def stop(self): 
     self.server.close() 
     self.join() 

अब सर्वर शुरू करने के लिए 0

# This is the communication server, it is going to listen for incoming connections, it has its own thread: 
s = ServerThread(PORT) 
s.start()    # Here we start the thread for the server 
print "Server is ready..." 
print "Is ServerThread alive? {t}".format(t=str(s.is_alive())) 
raw_input("Press any key to stop de server now...") 
print "Trying to stop ServerThread..." 
s.stop() 
print "The server will die in 30 seconds..." 

आप देखेंगे कि सर्वर तुरंत मरता नहीं है ... लेकिन यह शान से

संबंधित मुद्दे