Java UDP Receiver未接收数据

时间:2016-09-16 07:49:30

标签: java network-programming udp

这是我的发件人计划

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

    }
}

我得到的是,当监听器正在运行时,它似乎在等待发送者发送数据(打印"开始收听")。执行发件人时,它似乎也正常运行(打印"发送数据")。接收器也会进一步执行(打印"完成!"),但数据包仍为空。

可能是什么问题?

2 个答案:

答案 0 :(得分:2)

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

颠倒事物的顺序:

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

答案 1 :(得分:0)

在使用数据填充缓冲区之前,您正在创建数据包,因此您正在发送空缓冲区。

按如下所示更改行的顺序,程序按预期工作:

//get data
String data="Hello";
buffer=data.getBytes();
DatagramPacket packet=new DatagramPacket(buffer,buffer.length,address,10000);