2017-04-19 3 views
0

だから、私は今朝問題を抱えて、まだ投稿された回答が見つかりませんでした。基本的には、サーバがシャットダウンするたびにPythonクライアントを再接続させたいと思っていました。サーバーシャ​​ットダウン時にクライアントソケットを自動的に再接続しますか?

私の前のコードは、この

def fire(self): 
    self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    self.s.settimeout(5) 

    while (self.connected): 
     # create the transmission_struct class 

     msg = transmission_struct(self.stream, self.CHUNK, self.rate) 

     # create the Filestream packet 

     packet1 = msg.structure_msg_fls() 

     # create the decision packet 

     packet2 = msg.structure_msg_stm() 

     # send, first the decision packet 
     self.s.sendall(packet2) 

     # send the whole packet one by one 

     for i in range(len(packet1)): 
      self.s.sendall(packet1[i]) 

     # timestamp for debugging purposes 

     ts = time.time() 
     timestamp = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S') 
     print(timestamp + " size of data sent is " + str(len(packet1)) + 
       " size of decision is " + str(len(packet2))) 

答えて

0

のように見える私はtryexceptionブロックと試み関数の再帰を通じて再接続ロジックを実装しました。

def fire(self): 
    self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    self.s.settimeout(5) 
    self.attempt_connect() 

    while (self.connected): 
     # create the transmission_struct class 

     msg = transmission_struct(self.stream, self.CHUNK, self.rate) 

     # create the Filestream packet 

     packet1 = msg.structure_msg_fls() 

     # create the decision packet 

     packet2 = msg.structure_msg_stm() 

     try: 
      # send, first the decision packet 
      self.s.sendall(packet2) 

      # send the whole packet one by one 

      for i in range(len(packet1)): 
       self.s.sendall(packet1[i]) 

      # timestamp for debugging purposes 

      ts = time.time() 
      timestamp = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S') 
      print(timestamp + " size of data sent is " + str(len(packet1)) + " size of decision is " + str(len(packet2))) 

     except socket.error as e: 
      print(e.errno) 
      self.connected = False 
      print("Attempting to connect...") 
      self.close_open_new_socket() 
      time.sleep(1) 
      continue 

     except IOError as e: 
      print(e.errno) 
      self.close_open_new_socket() 
      continue 

     except KeyboardInterrupt: 
      self.s.close() 

     finally: 
      self.attempt_connect() 

def attempt_connect(self): 
    while (self.connected is False): 
     try: 
      self.result = self.s.connect((self.host, self.port)) 
      if (self.result == None): 
       self.connected = True 
      else: 
       self.connected = False 
     except socket.error as e: 
      errorcode = e[0] 
      print(errorcode) 
      if (errorcode == 56): 
       self.connected = True 
       time.sleep(1) 
       continue 
      elif(errorcode == 22): 
       self.connected = False 
       print("attempting to reconnect...") 
       # adding recursive call to attempt connect 
       # after socket is broken 
       self.close_open_new_socket() 
       time.sleep(1) 
       continue 
      elif (errorcode == 61): 
       self.connected = False 
       print("Server not up, waiting for server and reconnecting...") 
       time.sleep(1) 
       continue 
      elif (errorcode == 32): 
       self.connected = False 
       print("Server down, attempting to reconnect...") 
       time.sleep(1) 
       continue 
      else: 
       self.connected = False 
       time.sleep(1) 
       continue 

def close_open_new_socket(self): 
    self.s.close() 
    self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    self.s.settimeout(5) 
    self.attempt_connect() 
+0

これはあなたのために機能しましたか?私はどのように表示されません。どの再帰もありません。また、接続をfalseに設定しているので、ループから落ちるだけです。 – tdelaney

+0

完全に私のために働いた。再帰について、私はclose_open_new_socketを呼び出しました。これにはtry_connectの中にtry_connectが含まれています。 –

関連する問題