2016-08-15 15 views
0

サーバー側と通信するためにPythonクライアントを作成しました。私がデータを研磨し終えるたびに、私はsock.shutdown(socket.SHUT_WR)に電話しなければなりません。さもなければ、サーバーは何の反応もしません。しかしsock.shutdown(socket.SHUT_WR)を呼び出した後、私は接続をsock.connect((HOST, PORT))と再接続する必要があります。他の賢明な方法は、サーバーにデータを送信できません。では、どうすれば接続を閉じずに接続を維持できますか。 私のサンプルコードは、次のように:Pythonでシャットダウンソケット接続なしでデータを継続的に送信するには

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock.connect((HOST, PORT)) 
sock.sendall(data) 
sock.shutdown(socket.SHUT_WR) 
received = sock.recv(1024) 
while len(received)>0: 
    received = sock.recv(1024) 
sock.sendall(newdata) # this would throw exception 

をサーバー側のコードは以下の通り:

def handle(self): 
    cur_thread = threading.current_thread() 
    while True: 
     self.data = self.rfile.read(bufsiz=100) 
     if not self.data: 
      print 'receive none!' 
      break 
     try: 
      data = self.data 
      print 'Received data, length: %d' % len(data) 
      self.wfile.write('get received data\n') 
     except Exception: 
      print 'exception!!' 

答えて

1

あなたは、任意のサーバー側のコードを示さなかったが、私はそれはもう何を取得しなくなるまで、それは単にバイトを読み込み疑い。

これを行うことはできません。サーバーにメッセージが完全であることを伝える唯一の方法は、接続を強制終了することです。

代わりに、プロトコルにフレーミングの形式を追加する必要があります。可能なアプローチには、サーバーが認識する指定された停止文字(たとえば、改行文字1文字または0バイトなど)、クライアントとサーバーが同意する固定サイズのフレームを送信する方法、フレームサイズを最初にネットワーク符号化として送信する方法整数の後ろに指定されたバイト数が正確に続きます。次に、サーバーは最初に整数を読み取ってから、ソケットから正確に同じバイト数を読み取ります。

こうすれば、接続を開いたままにして、複数のメッセージを送信できます。

関連する問題