2017-11-24 21 views
0

私は、asyncoreを使用してPythonでソケットTCPサーバーでした。私のhandle_read関数は:Python Asyncoreは、クライアントの切断時にhandle_readを実行します。

def handle_read(self): 

    data = self.recv(50) 

    '''interpretar os comandos: 
    operação: Ligar/Desligar Bomba, Ligar/Desligar Aquecedor, Alterar velocidade da bomba 
    Modo: trocar de modo automático para remoto 
    Armazenamento: ativar ou desativar o armazenamento de dados para o trend e 
    também apagar dados 
    ''' 
    if len(data) < 2: #comandos digitais 
     try: 
      process_commands(data) 
     except Exception as err: 
      print(str(err)) 
    else: #comando analogico 
     try: 
      ld = json.loads(data.decode('utf-8')) 
      bytescommand = pack('f',ld['pump_speed']) 
      bus.write_block_data(arduinoAddress,53,list(bytescommand)) 
     except Exception as err: 
      print(str(err)) 
     finally: 
      pass 

私は受け取ったデータをテストして関数を実行します。しかし、クライアントの切断は、プログラムが返したとき:

「char形式はな長さ1のバイトオブジェクトを必要とし」これはhandle_read機能はときにクライアントの切断を実行していることを示しています。 これは正常ですか?どのように状況を処理するのですか?

ありがとうございます!

答えて

0

これは通常の呼び出しです。ピアがソケットを閉じる(または単にSH_WRでシャットダウンする)と、read呼び出しはすぐに0バイトで返されます。

だからあなたhandle_readソケット上のファイルの終わりのために準備する必要があります。

デフhandle_read(自己):

... 
if len(data) == 0: # EOF on input socket 
    pass   # or add disconnection processing... 
elif len(data) < 2: #comandos digitais 
    ... 
関連する問題