当前位置: 首页 > 工具软件 > Packet.Net > 使用案例 >

网络编程04:UDP聊天和UDP Packet里面getData()的一个坑

汤枫
2023-12-01

本篇文章是再UDP发消息的升级版,UDP聊天
一个Demo01负责消息发送,Demo02负责接收消息

消息发送方

  1. 建立一个socket
  2. 准备数据,从控制台读取数据
    (1)建立缓冲输入流
    (2)建立循环发送消息,已经终止循环的条件
  3. 释放资源
package Udp聊天;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class UdpSenderDemo01 {
    public static void main(String[] args) throws IOException {
        //1.建立一个socket
        DatagramSocket socket = new DatagramSocket(8888);

        //2.准备数据:从控制台读取
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        while (true){
            String data= reader.readLine();
            byte[] data2=data.getBytes();
            //发送什么数据,数据开始位置到结束位置,发送数据的地址和端口号
            DatagramPacket packet = new DatagramPacket(data2, 0, data2.length, new InetSocketAddress("localhost", 6666));
            //3.发送数据
            socket.send(packet);

            if(data.equals("bye"))
                break;

        }
        //4.释放资源
        socket.close();


    }
}

消息接收方

  1. 建立一个socket
  2. 循环接收数据模块设计,以及终止循环的条件
  3. 释放资源
package Udp聊天;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

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

        //
        DatagramSocket socket = new DatagramSocket(6666);
        while (true){
            //接收数据
            byte[] buffer=new byte[1024];
            DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
            //阻塞式接收数据
            socket.receive(packet);

            byte[] data=packet.getData();
            String receiveData=new String(data,0, packet.getLength());

            /*
            关于这里使用data.Length,不能结束的原因:
            data.Length=packet.getData().Length 那么出来的receiveData长度不是“bye”字符长度
            所以这里,直接用packet

            发送端发送bye
            System.out.println(packet.getLength());结果是3
            System.out.println(data.length);结果是1024

             */

            //System.out.println(packet.getLength());9/3
            //System.out.println(data.length);1024/1024
            System.out.println(receiveData);
            //需要设置断开点解的条件
            if(receiveData.equals("bye"))
                break;
        }
        socket.close();
    }
}


接收端遇到的坑

关于UDP Packet通信,里面getData()有一个坑

情况描述:

解决方案:

String receiveData=new String(data,0, data.Length)改为String receiveData=new String(data,0, packet.getLength())

分析研究

DatagramPacket的两个方法getData()和getLength()是不对应的。getLength()反映了刚刚接收到的数据的长度,而getData()反映了DatagramPacket对应缓冲区中的新接收到的数据和未被覆盖的旧数据,当我们使用DatagramPacket来处理新接收到的数据时,就容易同时触及到旧数据导致混乱。

发送端发送:
你好啊
bye
接收端:
System.out.println(packet.getLength());输出9/3
System.out.println(data.length);输出1024/1024
因为我们第一开始定义的数组长度是1024

https://blog.csdn.net/xiaohaier8593/article/details/90338770,深入探究可查看此文章

 类似资料: