2016-09-28 13 views
5

Tôi đang cố gắng nhận dữ liệu từ một khách hàng và sau đó đăng nhập vào bảng điều khiển. Dưới đây là làm thế nào tôi làm điều này:Làm thế nào để xóa nội dung của một mảng trong Java với an toàn?

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(); 
} 

Khi nói đến in messageToPrint của tôi nó thực sự lặp đi lặp lại người cuối cùng, và in lại nó bằng một cái mới hơn.

Tôi đã tìm ra vấn đề là gì.

Nếu tôi đặt phân bổ mảng data bên trong vòng lặp while, mọi thứ hoạt động tốt và tôi không nhận lại tin nhắn trước đó, chỉ một tin nhắn hiện tại. .

tôi không thực sự muốn làm điều này, bởi vì phân bổ trong vòng không phải là một ý tưởng tốt vì vậy tôi cần phải bằng cách nào đó để xóa mảng của tôi trước khi dữ liệu mới do thỏa thuận hợp

Sản lượng mà không phân bổ bên trong vòng lặp là:

Console: past message 

Console: (imagine i typed hello) hellomessage 

v.v.

+2

'Arrays.fill() '? Nhưng tôi nghi ngờ rằng sẽ nhanh hơn nhiều so với phân bổ một mảng mới –

+2

Không chắc chắn ... nhưng bạn cũng đã cố gắng để làm cho * gói * một lĩnh vực của lớp bao quanh của bạn? – GhostCat

+0

Hoặc có thể; điều này có giúp được không: http://stackoverflow.com/questions/17549195/clear-datagram-buffer-in-java? – GhostCat

Trả lời

2

Tạo gói bên ngoài vòng lặp và cũng lấy dữ liệu kích thước từ gói. (Nếu không, bạn sẽ in toàn bộ mảng có thể chứa văn bản dấu của thông điệp cuối cùng nhận được)

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

Đã hoạt động. Tôi sẽ đánh dấu nó là chấp nhận càng sớm càng tốt. –

+0

nhưng lý do thực sự cho vấn đề của op là gì và tại sao điều này giải quyết nó? làm thế nào nó hoạt động? – dabadaba

Các vấn đề liên quan