【发布时间】:2011-11-22 17:47:59
【问题描述】:
我正在尝试编写一个关于 UDP 连接的简单程序来了解它们。我已经实现了一些基本的东西,但是当我尝试发送并取回我发送的内容时,我遇到了一些问题,例如,
当我这样做时; 发送一个字符串
“asd”到服务器我回来 asdxxxxxxxxxx 当我尝试打印我在服务器中得到的内容时,我得到 [B@5f186fab
我该如何解决这个问题?
为了更清楚,我向您发送了几行代码,
在客户端;
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);
谢谢大家
EDIT 1 我认为我的缓冲区有问题,但我不知道如何解决。
【问题讨论】:
-
你真的是在得到
asdxxxxxxxxxx(或asdxxxxxxx)吗?或者这只是您帖子中的一个占位符(以及下面的评论)? -
其实不是和x,它是一个像[]这样的正方形,我真的是从控制台得到的。
-
查看以纯字符串和十六进制形式打印您收到的内容(在服务器端和客户端)。看看这是否能提供任何关于它可能来自何处的线索。方块可能代表不可打印的字符。
-
我认为问题是我在服务器端创建的缓冲区是 byte[256] 但我不知道如何根据即将到来的数据包动态创建它?
-
将其设置为最大预期数据包大小 + 1。然后,如果您收到一个大小如此之大的数据包,您就会知道存在数据截断,或者某处出现错误,或者您的期望是错误的。在任何情况下,UDP 数据包的最大实际大小都在 1500 字节以下,因此 2k 不会对您造成伤害。