文章目录

  • UDP协议
  • UDP协议链式编程
  • UDP协议键盘录入
  • UDP协议键盘录入多线程实现


UDP协议

java.net.DatagramSocket:此类表示用来发送和接收数据报包的套接字。 (里面有数据包那就是UDP协议)

UDP:
		把数据打包
		数据有限制
		不建立连接
		速度快
		不可靠

UDP协议发送和接收数据图解

java 基于udp协议的聊天 udp socket java_释放资源


UDP编程演示

UDP协议发送数据:

A:创建发送端Socket对象

B:创建数据,并把数据打包

C:调用Socket对象的发送方法发送数据包

D:释放资源

public class DataGramSocketSendDemo {
    public static void main(String[] args) throws IOException {
        //1.创建udp发送端Socket对象
        //DatagramSocket():构造数据报套接字并将其绑定到本地主机上任何可用的端口。
        DatagramSocket ds = new DatagramSocket();

        //2.创建数据并打包
        //不知道怎么创建数据并包,就先放着。先看后面
        //DatagramPacket(byte[] buf, int length, InetAddress address, int port):构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
        //将发送的数据转换为字节数组
        byte[] bys = "格雷福斯我要打野".getBytes();
        //获取字节数组的长度
        int len = bys.length;
        //指定发个那个ip,指定发送到哪个ip。
        InetAddress address = InetAddress.getByName("192.168.150.1");
        //定义端口
        int port = 10000;
        DatagramPacket dg = new DatagramPacket(bys, len, address, port);

        //3.使用Socket对象调用方法发送数据
        //但是我也不知道,怎么发送?那就去看该对象的方法。
        // void send(DatagramPacket p):从此套接字发送数据报包。
        //通过该方法的参数,知道了需要DatagramPacket的对象,参数里面介绍还需要一个四个参数的构造方法。
        ds.send(dg);

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

UDP协议接收数据:
A:创建接收端Socket对象
B:创建一个数据包(接收容器)
C:调用Socket对象的接收方法接收数据
D:解析数据包,并显示在控制台
E:释放资源

public class DatagramSocketReceiveDemo {
    public static void main(String[] args) throws IOException {
        //1.创建接udp收端Socket对象
       //1.DatagramSocket(int port):创建数据报套接字并将其绑定到本地主机上的指定端口。
        DatagramSocket ds  = new DatagramSocket(10000);

        //2.创建一个容器用于接收数据包
        //创建一个字节数组,因为我知道数据有多大
        //DatagramPacket(byte[] buf, int length):构造 DatagramPacket,用来接收长度为 length 的数据包。
        byte[] bys = new byte[1024];
        int len = bys.length;
        DatagramPacket dg = new DatagramPacket(bys,len);

        //3.调用Socket对象方法接收数据
        // void receive(DatagramPacket p):从此套接字接收数据报包。
        ds.receive(dg);//阻塞式方法 数据来了才读。

        //4.解析数据包,并显示在控制台
        // InetAddress getAddress():返回某台机器的 IP 地址
        InetAddress address = dg.getAddress();
        String ip = address.getHostAddress();
        //获取数据
        //void setData(byte[] buf):为此包设置数据缓冲区。 
        byte[] datas = dg.getData();
        //int getLength():返回将要发送或接收到的数据实际的长度。
        int lens = dg.getLength();

        String s = new String(datas,0,lens);
        System.out.println(ip + "传递的数据是:" + s);

        //5.释放资源
        ds.close();

    }
}

结果:

192.168.150.1传递的数据是:格雷福斯我要打野

UDP协议链式编程

UDP协议发送数据:
A:创建发送端Socket对象
B:创建数据,并把数据打包
C:调用Socket对象的发送方法发送数据包
D:释放资源

public class DatagramSocketSendDemo {
    public static void main(String[] args) throws IOException {
        //1.创建udp发送端Socket对象
        DatagramSocket ds = new DatagramSocket();

        //2.创建数据包
        byte[] bytes = "格雷福斯我要打野".getBytes();
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length, InetAddress.getByName("192.168.150.1"),10000);

        //3.使用Socket对象,发送数据。
        ds.send(dp);
        //4.释放资源
        ds.close();

    }
}

UDP协议接收数据:
A:创建接收端Socket对象
B:创建一个数据包(接收容器)
C:调用Socket对象的接收方法接收数据
D:解析数据包,并显示在控制台
E:释放资源

public class DatagramSocketReciveDemo {
    public static void main(String[] args) throws IOException {
        //1.创建udp接收端Socket对象
        DatagramSocket sd  = new DatagramSocket(10000);

        //2.创建数据包
        byte[] bytes=  new byte[1024];
        DatagramPacket dp =new DatagramPacket(bytes,bytes.length);

        //3.接收数据
        sd.receive(dp);

        //4.解析数据
        System.out.println(new String(dp.getData(),0,dp.getLength()));

        //5.关闭资源
        sd.close();
    }
}

UDP协议键盘录入

数据来自于键盘录入
键盘录入数据要自己控制录入结束。(输入886结束)
UDP协议发送数据:
A:创建发送端Socket对象
B:创建数据,并把数据打包
C:调用Socket对象的发送方法发送数据包
D:释放资源
代码演示

public class DatagramSoketSendDemo {
    public static void main(String[] args) throws IOException {
        //创建发送端Socket对象
        DatagramSocket ds = new DatagramSocket();

        //创建字符输出流对象(模拟键盘录入)
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        while (true) {
            String line = null;
            if ((line = br.readLine()) != null) {
                //这里是有个问题的,如果这里的死循环,没有break。ds.close()就会报错,
                // 如果没有终止,就不会走释放资源。
                if (line.equals("886")) {
                    break;
                }
                byte[] bytes = line.getBytes();
                //创建数据包,封装数据
                DatagramPacket dp = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("192.168.150.1"), 10001);
                //发送数据
                ds.send(dp);
            }
        }
        //释放资源
        ds.close();
    }
}

UDP协议接收数据:
A:创建接收端Socket对象
B:创建一个数据包(接收容器)
C:调用Socket对象的接收方法接收数据
D:解析数据包,并显示在控制台
E:释放资源

public class DatagramSocketReciveDemo {
    public static void main(String[] args) throws IOException {
        //1.创建接收端Socket对象
        DatagramSocket ds = new DatagramSocket(10001);

        while (true) {
            //2.创建数据包裹
            byte[] bys = new byte[1024];
            DatagramPacket dp = new DatagramPacket(bys, bys.length);

            //3.接收数据
            ds.receive(dp);

            //4.分析数据
            System.out.println(new String(dp.getData(), 0, dp.getLength()));
        }
        //5.释放资源
        //ds.close();
    }
}

结果:接受端

我想用男枪打野?
但是我的盲僧玩的更好怎么办?
我也可以玩亚索!

UDP协议键盘录入多线程实现

代码演示
多线程测试

public class ChatRoom {
    public static void main(String[] args) {
        //创建线程对象
        SendThread st=  new SendThread();
        ReciveThread rt=  new ReciveThread();
        //启动线程
        st.start();
        rt.start();
    }
}

UDP协议发送数据:
A:创建发送端Socket对象
B:创建数据,并把数据打包
C:调用Socket对象的发送方法发送数据包
D:释放资源

public class SendThread extends Thread {
    @Override
    public void run() {
        DatagramSocket ds = null;
        try {
            //1.创建发送端Socket对昂
            ds = new DatagramSocket();
            //创建字节输入流对象(模拟键盘录入)
            BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
            String line = null;
            while (true){
                if((line=br.readLine())!=null){
                    if("886".equals(line)){
                        break;
                    }
                    byte[] bytes = line.getBytes();
                    //2.创建数据包,并封装数据
                    DatagramPacket dp = new DatagramPacket(bytes,bytes.length, InetAddress.getByName("192.168.150.1"),10002);
                    //3.发送数据
                    ds.send(dp);
                }
            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
        //4.关闭资源
            ds.close();
        }
    }
}

UDP协议接收数据:
A:创建接收端Socket对象
B:创建一个数据包(接收容器)
C:调用Socket对象的接收方法接收数据
D:解析数据包,并显示在控制台
E:释放资源

public class ReciveThread extends Thread {
    @Override
    public void run() {
        //1.创建接收端Socket对象
        try {
            DatagramSocket ds = new DatagramSocket(10002);
            while (true) {
                //2.创建数据包裹
                byte[] bytes = new byte[1024];
                DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
                //3.接收数据
                ds.receive(dp);
                //4.分析数据
                byte[] data = dp.getData();
                //返回实际长度
                int len = dp.getLength();
                System.out.println(new String(data, 0, len));
            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

结果:

天降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,揉食指然也。
天降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,揉食指然也。
岳云鹏,郭德纲。
岳云鹏,郭德纲。
我想用格雷福斯打野
我想用格雷福斯打野