2014-02-19 60 views
0

下面的代碼給我的問題:Python的服務器瞬間斷開

def connect(): 
    s.listen(2) 
    print("Server listening") 
    conn,addr=s.accept() 
    print("Connected with " + str(addr) + '\n') 
    recv() 

def recv(): 
    while 1: 
     try: 
      print("Starting try statement") 
      data=conn.recv(1024) 
      if data == "": 
       print("No data") 
       recv() 
      else: 
       print("Data") 
       print(data.decode('UTF-8') + " -END") 
       recv() 
     except: 
      print("No connection") 
      connect() 
     conn.close() 

當我執行的代碼,它會連接到客戶端,並準備在任何時候接收消息。但是,一旦執行它就會出現。

Server listening 
Connected with ('xx.xxx.xxx.xx', xxxxx) 

Starting try statement 
No connection 
Server listening 

IP審查。有沒有人有這方面的修復?

編輯:錯字

客戶端代碼(從使用TKinter GUI)

s.connect((host,port)) 
     self.chatlog['state'] = NORMAL 
     self.chatlog.insert(END, ("===CONNECTED TO SERVER\n")) 
     self.chatlog['state'] = DISABLED 
     self.chatlog.yview(END) 
     self.conn=True 
     print("Connected") 
+4

這段代碼看起來很糟糕。從'while 1'循環中,並遞歸調用自己? – user590028

+0

「conn」和「connect」名稱是指什麼?你能提供一個最小的可運行示例嗎? – Bach

+0

是的我正在使用遞歸,因爲一旦收到數據,我希望服務器準備好接收更多。 – QuarterGeekster

回答

1

你做錯了。

雅'現在本地conn你在函數connect中創建什麼不能從函數recv訪問嗎?這是不接收任何東西的原因。

使用的代碼,而無需使用類和線程但選擇和sys模塊我的解決辦法是:

import sys 
import select 

def connect() 
    s.listen(2) 
    print('Sever listening') 
    inputs = [s, sys.stdin] 
    running = 1 
    while running: 
     i_rdy = select.select(inputs,[],[],1)[0] 

     if s in i_rdy: 
      conn, addr = s.accept() 
      print ('Connected with ' + str(addr) + '\n') 
      recv(conn) 

     if sys.stdin in i_rdy: 
      junk = std.stdin.readline() 
      if junk.lstrip('\n') == 'exit': 
       running = 0 
       print('Closing server') 

    s.close() 

def recv(conn): 
    while 1: 
     try: 
      print("Starting try statement") 
      data = conn.recv(1024) 
      if data == "": 
       print("No data") 

      else: 
       print("Data") 
       print(data.decode('UTF-8') + " -END") 

     except: 
      print("No connection") 
      #traceback 
      print(sys.exc_info) 
      break 
    try: 
     conn.close() 
    except: 
     pass 

正如你可以看到可以「退出」當u鍵入exit安慰,但只有當不存在主動連接...

爲什麼你應該考慮重寫這個類,它會更容易停下來,而不是「醜陋」,它可以處理多個連接。

+0

非常感謝你真正有幫助,並給予體面的解釋。本網站的其他人一直沒有什麼幫助。我會很快測試一下,如果有效,我會將其標記爲這樣。 – QuarterGeekster