2012-01-09 11 views
1

メッセージをデータをうまく処理するために)。興味深いことに、1分(最大1時間程度)待ってから、ソケットサーバーは、目に見える介入なしにメッセージの送受信を再開します。のpython socketserverは時折送信を停止(および受信?)私はsocketserverが他のポートを継続しながら、それは(使用ポートの1つでデータの送受信を停止しているように見えるでしょう私が書いたsocketserverの問題を経験してきた

私はすべてが外部のアプリがsocketserverに持続的な接続をオープンするとUbuntuのAWSインスタンス上で実行されている、のpython 2.7をEventletのソケットフレームワークを使用しています。

私が行ってきたいくつかの読書から私が正しく私のソケットサーバーを実装することはできませんように、それが見えます。 よるhttp://docs.python.org/howto/sockets.htmlへ:ソケットの

基本的な真実:メッセージがシャットによって長さ(不潔)に固定されなければならないか、>>(肩をすくめる)に区切られ、または、彼らは(より良い)されているどのくらいの時間を示し、または終了接続を切断します。

私はここに固定長のメッセージを使用していますことを全くわからない

これは私が私のデータを受信して​​います方法です(または私は?):

def socket_handler(sock, socket_type): 
    logg(1,"socket_handler:initializing") 
    while True: 
     recv = sock.recv(1024) 
     if not recv: 
      logg(1,"didn't recieve anything") 
      break 
     if len(recv) > 5: 
      logg(1,"socket handler: %s" % recv) 
      plug_id, phone_sid, recv_json = parse_json(recv) 
      send = 1 
      if "success" in recv_json and recv_json["success"] == "true" and socket_type == "plug": 
       send = 0 
      if send == 1: 
       send_wrapper(sock, message_relayer(recv, socket_type)) 
     else: 
      logg(2, 'socket_handler:Ignoring received input: ' + str(recv) ) 
    logg(1, 'Closing socket handle: [%s]' % str(sock)) 
    sock.shutdown(socket.SHUT_RDWR) 
    sock.close() 

「靴下」されますlistener.accept()関数によって返されるソケットオブジェクト。

socket_handler関数がそうのように呼び出されます。

new_connection, address = listener.accept() 
...<code omitted>... 
pool.spawn_n(socket_handler, new_connection, socket_type) 

は私の実装では、誰にも間違って見ていますか?私は基本的に固定長の会話プロトコルを実装していますか?問題を調査したり、コードをより堅固にするために何ができるでしょうか?事前に

おかげで、

T

答えて

2

あなたが実際にクライアントから送信しているよりも、サーバー(1024)でより多くのバイトを受信を要求している場合は、関連する問題をバッファリングしたことがあります。この問題を解決するには

、何が通常行われている最初のメッセージの長さをエンコードし、メッセージそのものです。このようにして、レシーバは(既知のサイズの)長さフィールドを取得し、デコードされた長さに基づいて残りのメッセージを読み取ることができます。

注:長さフィールドは、あなたのプロトコルに必要な限り通常のバイト数です。いくつかのプロトコルは4バイトで整列されており、32ビットのフィールドを使用していますが、1バイトまたは2バイトで十分であれば、それを使うことができます。ここでのポイントは、クライアントとサーバーの両方がこのフィールドのサイズを知っていることです。

+0

ありがとう、私はこれが問題だったかもしれないと懸念していました。 Iが小さなメッセージを取得するときに、メッセージの長さの符号化は、実際のメッセージの長さと正確に一致する必要があり、またはIを持つことができ、たとえば、そのようなメッセージとして近似は大小の長さ、およびバイトのX番号を読み取るず、 xxx私は大きな得るバイト数? – tedtoy

+0

EDIT(ちょうどあなたの応答を読み返す - 私はより良いことを学ぶべきである= /):バッファリングの問題がどのように起こるか説明できますか?クライアントが500バイトを送信しても、私は502を読みます。どの時点でバッファリングの問題に気づき始め、そのようなケースをどのように検出して処理できますか? – tedtoy

+0

@tedtoyメッセージが送信者でエンコードされている場合、データのサイズは通常事前にわかっています。そうでない場合は、複数のメッセージを送信することができます(データの送信が完了したときに受信者を有効にするための追加のシグナリングメッセージ)。 – jcollado

関連する問題