2016-09-28 3 views
5

クライアントからデータを受信し、コンソールにログオンしようとしています。ここ は、私がこれを行う方法です。Javaで配列の内容を安全に消去するにはどうしたらいいですか?

private final int MAX_PACKET_SIZE = 1024; 
private byte[] data = new byte[MAX_PACKET_SIZE]; 

private void receive() { 
    new Thread(() -> { 
     while (running) { 
      DatagramPacket packet = new DatagramPacket(data, data.length); 
      try { 
       socket.receive(packet); 
       sPort = packet.getPort(); 
       ip = packet.getAddress(); 
       address = ip.toString(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      String messageToPrint = new String(packet.getData()); 
      System.out.println(messageToPrint.trim() + " " + address + " | " + sPort); 
     } 
    }).start(); 
} 

それは私のmessageToPrintそれは実際に最後の1を繰り返し、新規の方でそれを再印刷の印刷に来るとき。

私は問題が何であるかを考え出しました。

ループをwhileループ内に配置すると、すべて正常に動作し、以前のメッセージが再び表示されません。 。

私は新しいデータがに来る前に、私の配列をクリアする何とか必要があるので、割り当ては内部良いアイデアではなくループので、私は本当に、これを行うにはしたくない

出力ループ内の割り当てなしでは、次のとおりです。

Console: past message 

Console: (imagine i typed hello) hellomessage 

など。

+2

'Arrays.fill()'(そうしないと、最後に受信したメッセージの末尾にテキストを含めることができ、アレイ全体を印刷しますか)?しかし、私は新しい配列を割り当てるよりもはるかに速くなるとは思っていません –

+2

わかりませんが、*パケット*をあなたの囲むクラスのフィールドにしようとしましたか? – GhostCat

+0

またはおそらく;これは役に立ちます:http://stackoverflow.com/questions/17549195/clear-datagram-buffer-in-java? – GhostCat

答えて

2

ループ外のパケットを作成し、パケットからサイズデータを取得します。

final DatagramPacket packet = new DatagramPacket(data, data.length); 
while (running) { 
    try { 
     socket.receive(packet); 
     ... 
    final String messageToPrint = new String(
      packet.getData(), 
      packet.getOffset(), 
      packet.getLength()); 
    ... 
+0

Worked。私はただちに受け入れられるとマークします。 –

+0

しかし、opの問題の実際の理由は何だったのでしょうか?どのように機能するのですか? – dabadaba

関連する問題