UDP中使用的DatagramPacket

Posted

技术标签:

【中文标题】UDP中使用的DatagramPacket【英文标题】:DatagramPacket Using in UDP 【发布时间】:2020-03-16 10:31:05 【问题描述】:

我正在尝试使用 Java 中的 DatagramPacket 与服务器和客户端进行通信。

我的目标是:当客户端说:“你好”时,服务器应该回复:“嗨,很高兴认识你”。所以我使用 if 条件来实现这一点。

但是,当输入是“Hello”时,它似乎跳过了 if 条件(我已经使用了调试)。我想知道为什么会这样?好像太诡异了。谁能帮我解决这个问题?任何帮助,将不胜感激!谢谢!

代码:

客户:

public static void main(String[] args) 
        System.out.println("This is Server");
        DatagramSocket server = null;
        byte[] container = new byte[1024];
        try 
            server = new DatagramSocket(9998);
         catch (SocketException e) 
            e.printStackTrace();
        
        DatagramPacket dPacket = new DatagramPacket(container, container.length);   
        try 
            while(true)                
                server.receive(dPacket);
                byte[] datas = dPacket.getData();
                String temp = new String(datas);
                if (temp.equals("Hello")) 
                    System.out.println("Hi~!Nice to meet you!");
                else if (temp.equals("How are you?")) 
                    System.out.println("I am good!");
                else 
                    System.out.println("Have a good day");
                
                if (temp.equals("exit")) 
                    break;
                


            
         catch (IOException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        
        server.close();
    

客户:

public static void main(String[] args) 
        // TODO Auto-generated method stub
        System.out.println("This is Client");
        try 
            DatagramSocket client = new DatagramSocket(8888);
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String input = "";
            while(!input.equals("exit")) 
                input = br.readLine();
                byte[] msg = input.getBytes();
                DatagramPacket dPacket = new DatagramPacket(msg, msg.length,new InetSocketAddress("localhost",9998));
                client.send(dPacket);
            

            client.close();
         catch (Exception e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        

【问题讨论】:

【参考方案1】:

接收数据时尝试以下操作。

byte[] datas = dPacket.getData();
String temp = new String(datas, 0, dPacket.getLength());

【讨论】:

谢谢shazin,它工作。你能解释一下为什么会这样吗?我有点困惑。 DatagramPacket 除了来自客户端/服务器的消息之外,它还可能包含来自低级别网络缓冲区的垃圾值。这些值将与消息一起在数据字节数组中。但是DatagramPacket.getLength() 将具有原始消息的长度,没有垃圾值。因此,当我们使用String 的偏移量和基于长度的构造函数时,您可以从字节数组中获取准确的消息,而不会产生垃圾。

以上是关于UDP中使用的DatagramPacket的主要内容,如果未能解决你的问题,请参考以下文章

Rust 中同时使用 UDP 和 TCP 协议 [关闭]

是否可以在 Flash/ActionScript 中使用 UDP?

udp是啥意思

Socket 通信之 UDP 通信

Node.js笔记:UDP基础使用

Node.js笔记:UDP基础使用