Java 接收和发送的UDP包存在问题?
我试图写一个关于UDP连接的简单程序来了解它们。我已经实现了一些基本的东西,但是当我尝试发送和返回我发送的东西时,我会遇到一些问题,比如 当我这样做的时候; 发送字符串 “asd”到服务器,我返回asdxxxxxxxxxx 当我试图打印服务器中的内容时[B@5f186fab 我怎样才能解决这个问题 更清楚地说,我给你发了几行代码 在客户端Java 接收和发送的UDP包存在问题?,java,sockets,udp,datagram,Java,Sockets,Udp,Datagram,我试图写一个关于UDP连接的简单程序来了解它们。我已经实现了一些基本的东西,但是当我尝试发送和返回我发送的东西时,我会遇到一些问题,比如 当我这样做的时候; 发送字符串 “asd”到服务器,我返回asdxxxxxxxxxx 当我试图打印服务器中的内容时[B@5f186fab 我怎样才能解决这个问题 更清楚地说,我给你发了几行代码 在客户端 Scanner in = new Scanner(System.in); String result = in.nextLine();
Scanner in = new Scanner(System.in);
String result = in.nextLine();
// send request
byte[] buf = new byte[1000];
String read = result;
InetAddress address = InetAddress.getByName("localhost");
DatagramPacket packet = new DatagramPacket(result.getBytes(), result.getBytes().length, address, 4445);
socket.send(packet);
// get response
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
// display response
String received = new String(packet.getData(), 0, packet.getLength());
System.out.println("Quote of the Moment: " + received);
服务器端
byte[] buf = new byte[1000];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
byte[] received = packet.getData();
System.out.println(received.toString());
// figure out response
// send the response to the client at "address" and "port"
InetAddress address = packet.getAddress();
int port = packet.getPort();
packet = new DatagramPacket(received, received.length, address, port);
socket.send(packet);
谢谢大家
编辑1我想我的缓冲区有问题,但我不知道如何解决。您可以使用
System.out.println(Arrays.toString(received));
但你可能想要的是
System.out.println(new String(received, o, lengthRead, "UTF-8"));
你把这个修好了吗
否则,我发现,如果您声明接收的字节[]buf
的容量大于实际接收的长度字符串,那么最终将导致缓冲区的其余部分充满不需要的字节
例如,如果您声明byte[]received=新字节[1000];
但只收到一个4字节的字符串,那么最终将得到996个不需要的字节
解决这个问题的一个快捷方法是
byte[] received = packet.getData();
System.out.println(received.toString().trim());
trim()
帮了我的忙。希望这对你有帮助!非常感谢。它在服务器端起作用,但实际上我不明白为什么我在发送asd时仍然收到asdxxxxxxx。@Ozer打印收到的长度
,然后在收到数据后查看缓冲区有多大data@nos实际上我试过了,但是字符串和缓冲区的长度都是same和256@Ozer,我已经改变了第二个例子,如果它不是整个缓冲区,那么取长度。如果你今年要读一个javadoc,我建议你读一个字符串。;)你是真的得到了asdxxxxxxxxxx
(或者asdxxxxxxx
),还是这只是你文章中的一个占位符(以及下面的评论)实际上它不是和x,它是一个像[]的正方形,我真的是从控制台得到它的。看看打印你收到的东西(在服务器和客户端)既可以是普通字符串,也可以是十六进制。看看这是否提供了它可能来自何处的线索。正方形可能代表不可打印的字符。我认为问题在于我在服务器端创建的缓冲区是字节[256]但我不知道如何根据即将到来的数据包动态创建它?将其设置为最大预期数据包大小+1。然后,如果您收到的数据包大小如此之大,您就会知道存在数据中继,或某个错误,或您的预期是错误的。UDP数据包的最大实际大小在任何情况下都低于1500字节,因此2k w不会伤害您。received.toString()
将返回类似于[Bxxxxxxx
格式的内容,而不是字节数组的内容,并且这是无效的。