2012-04-19 3 views
0

シンプルなJavaソケットクライアントに問題があります。接続が正しく確立され、サーバーとクライアントの両方がデータを送受信します。クライアントが数秒間接続を失うと、ソケットは終了して再確​​立されます。これは正常に完了しましたが、その時点で、クライアントが最後に受信したメッセージ(再接続前)は何の理由もなく再び受信されます(同じメッセージの2回の受信)。ソケットの再接続時にメッセージが重複して受信される

私のコードは次のとおりです。

ソケットを開始するには、次の接続が失われると

public class IncomingReader implements Runnable { 
    String message = ""; 

    @Override 
    public void run() { 
     Thread thisThread = Thread.currentThread(); 
     while (readerThread == thisThread) { 
      try { 
       while ((message = reader.readLine()) != null) { 
        manageServerMessage(message); 
       } 
      } catch (IOException e) { 
       Log.d(General.TAG, e.getMessage()+" "+e.getCause()); 
      } 
     } 

:データを読み込み

Socket sock = new Socket(); 
sock.bind(null); 
InetSocketAddress isa = new InetSocketAddress(serverIPAddress,serverPort); 
sock.connect(isa, conectionTimeOut); 
sock.setKeepAlive(true); 

InputStreamReader isR = new InputStreamReader(sock.getInputStream(), "UTF8"); 
reader = new BufferedReader(isR); 

out = new BufferedWriter(new OutputStreamWriter(
    sock.getOutputStream(), "UTF8")); 

public void stopSocket() { 
    readerThread = null; 
    try{ 
     if (reader != null){ 
      reader.close(); 
      reader=null; 
     } 
    } catch (IOException e) { 
     Log.d(General.TAG, e.getMessage()+" "+e.getCause()); 
    } 
    try{ 
     if (out != null) 
      out.close(); 
    } catch (IOException e) { 
     Log.d(General.TAG, e.getMessage()+" "+e.getCause()); 
    } 
    try{ 
     if (sock != null){ 
      sock.close(); 
      sock=null; 
     } 
    } catch (IOException e) { 
     Log.d(General.TAG, e.getMessage()+" "+e.getCause()); 
     sock=null; 
    } 
    readerThread = null; 
} 
+0

あなたの質問に答えられた場合、またはそれがもはや有効でない場合は、誰もが問題が解決されたことを知るように、最も適切な回答を選択してください。ありがとう。 – wattostudios

答えて

0

どのようにソケット接続を再確立していますか?この段階では2つの可能性を見ることができます...

  1. 接続を再作成する前に、すべての古い参照を完全に削除するわけではありません。新しいSocketブランドを作成していますか? BufferedReaderIncomingReaderスレッド?あなたが再作成していないものがある場合、それは以前の値を保持している可能性があります。新しいものを作成するのではなくIncomingReaderを再利用している場合、古い値を保持している可能性があります。

  2. 接続が閉じている場合、どのようにサーバー側で処理していますか?サーバーがクライアントに情報を送信しようとしているが接続が壊れている場合、サーバーは接続が再確立されたときに最後のメッセージを再送信しようとする可能性があります。もう一つの可能​​性は、サーバが壊れたときに接続を閉じることができない場合でも、古いデータを保持している可能性があります。

は基本的に、として最もよくすることができますように、あなたは確認する必要があり、その接続の中断は、クライアントとサーバーの両方での接続に関連するすべてのものが完全に閉じられ、新しいオブジェクトを使用して再作成する場合。すべてが新しいオブジェクトであれば、古いデータが何かを混乱させる可能性はありません。

関連する問題