这是我的发件人程序

import java.net.*;

class Send{
    public static void main(String[] args) {
        try{
            //setup
            DatagramSocket socket=new DatagramSocket();
            byte[] buffer=new byte[100];
            InetAddress address=InetAddress.getLocalHost();
            System.out.println("Address:"+address);
            DatagramPacket packet=new DatagramPacket(buffer,buffer.length,address,10000);

            //get data
            String data="Hello";

            //send data
            buffer=data.getBytes();
            System.out.println("Sending data");
            socket.send(packet);
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
}


这是接收器程序

import java.net.*;

class Listen{
    public static void main(String[] args) {
        try{
            //set up
            DatagramSocket socket=new DatagramSocket(10000);
            byte[] buffer=new byte[100];
            DatagramPacket packet=new DatagramPacket(buffer,buffer.length);
            //recieve
            System.out.println("Started Listening");
            socket.receive(packet);
            //print
            String receivedData=new String(packet.getData());
            System.out.println(receivedData);
            System.out.println("Done!");
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }

    }
}


我得到的是,当侦听器运行时,它似乎正在等待发送方发送数据(打印“开始侦听”)。执行发件人后,它似乎也可以正常运行(打印“正在发送数据”)。接收器也执行得更好(打印“完成!”),但是数据包仍然为空。

可能是什么问题?

最佳答案

问题是您永远不会在包中放入任何东西。首先,创建一个空数据包,然后用数据填充缓冲区-但该数据包中未使用该缓冲区。

颠倒顺序:

        String data="Hello";
        //get data
        // HERE : first put data in the buffer, THEN build the packet
        byte[] buffer=data.getBytes();

        InetAddress address=InetAddress.getLocalHost();
        System.out.println("Address:"+address);
        DatagramPacket packet=new DatagramPacket(buffer,buffer.length,address,10000);

        //send data
        System.out.println("Sending data");
        socket.send(packet);


正如Jon Skeet所述,您还需要担心两端的字符编码。如果在接收端执行String.getBytes()new String(byte[])时未指定编码,则将在计算机上使用默认的字符编码。如果您使用的是同一台计算机,这很好,但是如果发送方和接收方在不同的计算机上,并且计算机具有不同的平台默认字符编码,则可能会造成很多问题。

因此,您需要指定编码,如果发送的大部分文本都使用拉丁脚本,则最好是UTF8。

因此,在发送方:

byte[] buffer = data.getBytes(StandardCharsets.UTF_8);


在接收端:

String receivedData = new String(packet.getData(), StandardCharsets.UTF_8);

08-24 19:13
查看更多