2017-02-26 6 views
0

ソケットを使用して2つのデバイスを接続できるクラスを作成しましたが、お互いにメッセージを送信できるようにしました。私は受け取ったメッセージをDataInputStreamで取得します。DataInputStreamはwhile(true){}ループでメッセージを常にチェックします。私はメッセージを記録しますが、コンソール全体をスパムします。そこで、現在のメッセージが最後に受信したメッセージかどうかをチェックするlastMsgという変数を追加しました。この場合、メッセージは出力されないので、メッセージは一度しか記録されません。問題は、ユーザーが2つの同一のメッセージを送信すると、最初のメッセージのみが明らかにログに記録されることです。Javaソケット:DataInputStreamに一度だけメッセージを表示する方法

メッセージが2回送信されるか、メッセージが数秒前に送信されたものかどうかを確認する方法はありますか?

私のコードは、受信したメッセージを確認する:

public void run() { 
      Socket other = new Socket(); 
      try { 
      other.connect(new InetSocketAddress("xxxxxx", xxxx), 1000); 
      log("Connected to host"); 
      while (true) { 

       DataInputStream in = new DataInputStream(other.getInputStream()); 
       String msg = in.readUTF(); 
       if(!lastClientMsg.equals(msg)){ 
        log("[HOST-MSG] "+msg); 
        lastClientMsg = msg; 
       } 


      } 
       } catch (IOException e) { 
       log("Error at creating client: "+e.toString()); 
      } 

     } 
+0

Eh?現在のメッセージは最新のメッセージではありませんか? – EJP

+0

なぜそれは重複するでしょうか。これはTCP接続であり、ストリームから読み込むとメッセージは消えてしまいます。あなたがメッセージの内容について話しているなら、あなたがやっていることは大丈夫です。また、あなたのアプローチに間違っている別のものは、すべてのループでDataInputStreamを作成することです。これは良いアイデアではありません、一度入力ストリームを取得すると、それはそれです。あなたの無限ループは、そのストリームとバッファを読み取ることになっているはずです。あなたは完全なメッセージを認識する方法があると思います。ストリームのコンテンツは分割して部分的に読み込むことができます。 – Olayinka

+0

修正しました。ありがとうございます。 – stUser823

答えて

0

は、最後の20件のメッセージを格納するコレクションオブジェクトを使用してみてください。 ArrayListはうまくいくでしょう。最後の20個のメッセージを確認し、新しいメッセージごとに最初のメッセージを削除し、新しいメッセージをコレクションに追加します。

Good Luck。

0

DataInputStream.readUTF()メソッドを使用すると、入力バッファから文字列変数にメッセージを移動する必要がありますが、何らかの理由でバッファがクリアされません。いくつかのヒント:

  • DataInputStream宣言をwhileループの外に移動してみてください。あなたがメッセージをチェックするたびにそれを宣言することがあなたの問題かもしれません。
  • メッセージを送信するコードが一度だけ送信することを確認してください。何らかの理由でそれがループで送信されていると、入力ストリームが詰まってしまいます。

関連する問題