2016-09-28 5 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를 인쇄하고, 새로운 하나에 그것을 다시 인쇄에 관해서 :이 어떻게 여기 이다.

그래도 문제가 무엇인지 알아 냈습니다.

while 루프 안에 배열 data을 넣으면 모든 것이 올바르게 작동하고 이전 메시지가 다시 나타나지 않습니다. . 할당 내부 내가 새로운 데이터에 오기 전에 내 배열을 취소 어떻게 든 필요가 너무 좋은 생각을하지 루프 때문에

정말 이렇게하지 않으려는

출력을 루프 내부 할당없이 것은 :

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

관련 문제