Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 接收和发送的UDP包存在问题?_Java_Sockets_Udp_Datagram - Fatal编程技术网

Java 接收和发送的UDP包存在问题?

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

我试图写一个关于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);
谢谢大家

编辑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
格式的内容,而不是字节数组的内容,并且这是无效的。