2012-09-06 38 views
2

如何在Python中完全退出服務器?代碼如server.shutdown()只是關閉傳入的請求。任何人都可以提出任何代碼完成退出服務器?這是一個簡單的socketserver。如何在python中完全退出服務器?

這是我的代碼服務器:

#!/usr/bin/python 
import socket 
from threading import Thread 

class sockServer: 

    def __init__(self,port): 
     self.socket= socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
     self.socket.bind(port) 
     self.socket.listen(5) 

    def _run(self): 
     while True: 
      request, client_address =self.socket.accept() 
      counter=self.req_thread(self,request) 
      counter.start() 

    class req_thread(Thread): 
     def __init__(self,controller,request): 
      Thread.__init__(self) 
      self.controller=controller 
      self.request=request 
      self.setDaemon(True) 

     def run(self): 
      input=self.request.makefile('rb',0) 
      output=self.request.makefile('wb',0) 
      l=True 
      i=0 
      try: 
       while l: 
      l=input.readline() 
      if l!="exit\r\n": 
         print "x" 
         output.write(bytes('hello\n')) 
        else: 
      print "y" 
         self.request.shutdown(2) 
      run=False 

      except socket.error: 
       pass 


if __name__ == '__main__': 

    import sys 
    if len(sys.argv) < 3: 
     print('Usage: %s [hostname] [port number]' % sys.argv[0]) 
     sys.exit(1) 
    hostname = sys.argv[1] 
    port = int(sys.argv[2]) 
    global run 
    run=True 
    while run: 
     server=sockServer((hostname,port)) 
     server._run() 

使用可變run的方法是沒有好處!

+1

修復代碼的格式 –

+1

sys.exit(0)??? –

回答

2

如果sys.exit沒有再工作,你可以用一個更極端的版本,直接調用os。

import os 
os._exit() 

如果服務器分叉了一個新的進程或線程,你將不得不這樣做。這就是你在做什麼,爲什麼sys.exit不能按照你的預期工作。看到這兩個調用之間的區別說明:What is difference between sys.exit(0) and os._exit(0)

+0

它的作品!! thnx傢伙! – JTN

2

如果你只是想退出程序完全,那麼你可以隨時添加import sys,然後在執行此操作:

class req_thread(Thread): 
    def __init__(self,controller,request): 
     Thread.__init__(self) 
     self.controller=controller 
     self.request=request 
     self.setDaemon(True) 

    def run(self): 
     input=self.request.makefile('rb',0) 
     output=self.request.makefile('wb',0) 
     l=True 
     i=0 
     try: 
      while l: 
     l=input.readline() 
     if l!="exit\r\n": 
        print "x" 
        output.write(bytes('hello\n')) 
       else: 
     print "y" 
        self.request.shutdown(2) 
        sys.exit(0) 
     run=False 

     except socket.error: 
      pass 
+0

sys.exit()不適用於服務器。 – JTN