UDP接收数据

UDP receive data

我正在 Mac 中使用 IntelliJ Idea.I 编写有关 UDP 的程序,试图从客户端读取数据并打印服务器 receive.Here 代码的数据。

Server

public class UDPServer {
    public static void main(String[] args) throws IOException {

        DatagramSocket datagramSocket = new DatagramSocket(11111);
        byte[] b = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(b,1024);

        while (true){
            datagramSocket.receive(datagramPacket);

            byte[] data = datagramPacket.getData();
            InetAddress address = datagramPacket.getAddress();
            String ip = address.getHostAddress();
            String string = new String(data,0,data.length);
            System.out.println("IP is "+ip+" "+string);
        }
    } }

Client

public class UDPClient {
    public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

        String dataString;
        while((dataString = bufferedReader.readLine())!=null){
            if(dataString.equals("886")){
                System.out.println("UDPClient exit");
                break;
            }
            DatagramPacket datagramPacket = new DatagramPacket(dataString.getBytes(),dataString.getBytes().length, InetAddress.getByName("192.168.3.2"),11111);

            datagramSocket.send(datagramPacket);

        }

        datagramSocket.close();
    }

}

我先运行Server然后开始Client,输入something.Here的输入打印

input

123456

abcdef

hello

print

IP is 192.168.3.2 123456����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

IP is 192.168.3.2 abcdef����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

IP is 192.168.3.2 hellof����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

1.the 第三个打印有另一个 'f'

2.at每个打印的结尾都有很多小方块(我没有足够的信誉插入图片,抱歉)

问题出在服务器代码中:

String string = new String(data,0,data.length);

您正在根据数据缓冲区的整个大小而不是接收到的字节数构造字符串。因此,如果一个数据包比上一个数据包小,则该数据包中的任何其他字节仍会保留在缓冲区中。

您需要调用 datagramPacket.getLength() 来获取该值:

String string = new String(data,0,datagramPacket.getLength());