【问题标题】:Java UDP Receiver not receiving dataJava UDP 接收器未接收到数据
【发布时间】:2016-09-16 07:49:30
【问题描述】:

这是我的发件人程序

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

    }
}

我得到的是,当监听器运行时,它似乎在等待发送者发送数据(打印“开始监听”)。当 sender 被执行时,它似乎也能正常运行(打印“Sending data”)。接收者也继续执行(打印“完成!”),但数据包仍然是空的。

可能是什么问题?

【问题讨论】:

    标签: java network-programming udp


    【解决方案1】:

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

    颠倒顺序:

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

    【讨论】:

    • 虽然最好避免在二进制/文本转换位中使用平台默认编码...
    • @JonSkeet 好点,我已经添加了一些解释。
    • StandardCharsets.UTF_8 是你的朋友,IMO :)
    • @JonSkeet 这个名字不会突然出现在我的脑海里,谢谢提醒。那些只存在 5 年的新奇课程之一 :-)
    【解决方案2】:

    您在用数据填充缓冲区之前创建数据包,因此您发送的是一个空缓冲区。

    如下更改行的顺序,您的程序按预期运行:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多