ソケットを使用して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());
}
}
Eh?現在のメッセージは最新のメッセージではありませんか? – EJP
なぜそれは重複するでしょうか。これはTCP接続であり、ストリームから読み込むとメッセージは消えてしまいます。あなたがメッセージの内容について話しているなら、あなたがやっていることは大丈夫です。また、あなたのアプローチに間違っている別のものは、すべてのループでDataInputStreamを作成することです。これは良いアイデアではありません、一度入力ストリームを取得すると、それはそれです。あなたの無限ループは、そのストリームとバッファを読み取ることになっているはずです。あなたは完全なメッセージを認識する方法があると思います。ストリームのコンテンツは分割して部分的に読み込むことができます。 – Olayinka
修正しました。ありがとうございます。 – stUser823