我正在尝试从客户端接收数据,然后将其登录到控制台。 我是这样做的:
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
时,它实际上重复了最后一个,然后重新打印它。
我已经弄清楚了问题是什么。
如果我将数组data
分配到while
循环中,一切正常,我再也没有得到上一条消息,只是当前消息。
我真的不想这样做,因为内部循环分配不是一个好主意所以我需要以某种方式在新数据进入之前清除我的数组。
循环内没有分配的输出是:
Console: past message
Console: (imagine i typed hello) hellomessage
等等。
答案 0 :(得分: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());
...