【问题标题】:Problems with UDP Received and Sent UDP Packages?UDP 接收和发送 UDP 包的问题?
【发布时间】: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 不会对您造成伤害。

标签: java sockets udp datagram


【解决方案1】:

你可以使用

System.out.println(Arrays.toString(received));

但你可能想要的是

System.out.println(new String(received, o, lengthRead, "UTF-8"));

【讨论】:

  • 非常感谢。它在服务器端工作,但实际上我不明白为什么我在发送 asd 时仍然得到 asdxxxxxxx 。
  • @Ozer 在收到数据后打印出received.length 看看缓冲区有多大
  • @nos 其实我试过了,但是字符串和缓冲区长度都一样,都是 256
  • @Ozer,如果不是整个缓冲区,我已经更改了第二个示例以获取长度。如果你今年要阅读一个 javadoc,我建议你阅读 String 的那个。 ;)
【解决方案2】:

你解决了吗?

否则,我发现如果您声明接收byte[] buf 的容量大于您实际接收的长度字符串,那么缓冲区的其余部分将充满不需要的字节.

例如。如果你声明 byte[] received = new byte[1000]; 但只收到一个 4 字节的字符串,你最终会得到 996 个不需要的字节。

解决此问题的一种快速方法是执行类似的操作

byte[] received = packet.getData();
System.out.println(received.toString().trim());

trim() 帮了我大忙。希望对你有帮助!

【讨论】:

  • received.toString() 将返回 [Bxxxxxxx 形式的内容,而不是字节数组的内容,并且修剪是徒劳的。
猜你喜欢
  • 2014-11-14
  • 2012-10-03
  • 2012-05-20
  • 1970-01-01
  • 2019-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
相关资源
最近更新 更多