UDP协议

UDP协议的特点是什么
用户数据报协议(User Datagram Protocol)
UDP是面向无连接,不可靠传输的通信协议。
速度快,有大小限制一次最多发送64K,数据不安全,易丢失数据。

UDP协议的特点
UDP是一种无连接、不可靠传输的协议。
将数据源IP、目的地IP和端口以及数据封装成数据包,大小限制在64KB内,直接发送出去即可

DatagramPacket:数据包对象(韭菜盘子)
public DatagramPacket(byte[] buf, int length, InetAddress address, int port)
创建发送端数据包对象
buf:要发送的内容,字节数组
length:要发送内容的字节长度
address:接收端的IP地址对象
port:接收端的端口号
public DatagramPacket(byte[] buf, int length)
创建接收端的数据包对象
buf:用来存储接收的内容
length:能够接收内容的长度

DatagramSocket:发送端和接收端对象(人)

DatagramSocket类成员方法

使用UDP通信实现:发送消息、接收消息
创建DatagramSocket对象(发送端对象) 扔韭菜的人
创建DatagramPacket对象封装需要发送的数据(数据包对象) 韭菜盘子
使用DatagramSocket对象的send方法传入DatagramPacket对象 开始抛出韭菜
释放资源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.itheima.d2_udp1;
 
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
 
/**
  发送端  一发 一收
 */
public class ClientDemo1 {
    public static void main(String[] args) throws Exception {
        System.out.println("=====客户端启动======");
 
        // 1、创建发送端对象:发送端自带默认的端口号(人)
        DatagramSocket socket = new DatagramSocket(6666);
 
        // 2、创建一个数据包对象封装数据(韭菜盘子)
        /**
         public DatagramPacket(byte buf[], int length,
         InetAddress address, int port)
         参数一:封装要发送的数据(韭菜)
         参数二:发送数据的大小
         参数三:服务端的主机IP地址
         参数四:服务端的端口
         */
        byte[] buffer = "我是一颗快乐的韭菜,你愿意吃吗?".getBytes();
        DatagramPacket packet = new DatagramPacket( buffer, buffer.length,
                InetAddress.getLocalHost() , 8888);
 
        // 3、发送数据出去
        socket.send(packet);
 
        socket.close();
    }
}

使用UDP通信实现:发送消息、接收消息
需求:接收端实现步骤
创建DatagramSocket对象并指定端口(接收端对象) 接韭菜的人
创建DatagramPacket对象接收数据(数据包对象) 韭菜盘子
使用DatagramSocket对象的receive方法传入DatagramPacket对象 开始接收韭菜
释放资源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.itheima.d2_udp1;
 
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
 
/**
  接收端
 */
public class ServerDemo2 {
    public static void main(String[] args) throws Exception {
        System.out.println("=====服务端启动======");
        // 1、创建接收端对象:注册端口(人)
        DatagramSocket socket = new DatagramSocket(8888);
 
        // 2、创建一个数据包对象接收数据(韭菜盘子)
        byte[] buffer = new byte[1024 * 64];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
 
        // 3、等待接收数据。
        socket.receive(packet);
 
        // 4、取出数据即可
        // 读取多少倒出多少
        int len = packet.getLength();
        String rs = new String(buffer,0, len);
        System.out.println("收到了:" + rs);
 
        // 获取发送端的ip和端口
        String ip  =packet.getSocketAddress().toString();
        System.out.println("对方地址:" + ip);
 
        int port  = packet.getPort();
        System.out.println("对方端口:" + port);
 
        socket.close();
    }
}

使用UDP通信实现:多发多收消息
需求
使用UDP通信方式开发接收端和发送端。
分析
发送端可以一直发送消息。
接收端可以不断的接收多个发送端的消息展示。
发送端输入了exit则结束发送端程序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package com.itheima.d3_udp2;
 
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.Scanner;
 
/**
  发送端  多发 多收
 */
public class ClientDemo1 {
    public static void main(String[] args) throws Exception {
        System.out.println("=====客户端启动======");
 
        // 1、创建发送端对象:发送端自带默认的端口号(人)
        DatagramSocket socket = new DatagramSocket(7777);
         
 
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请说:");
            String msg = sc.nextLine();
 
            if("exit".equals(msg)){
                System.out.println("离线成功!");
                socket.close();
                break;
            }
 
            // 2、创建一个数据包对象封装数据(韭菜盘子)
            byte[] buffer = msg.getBytes();
            DatagramPacket packet = new DatagramPacket( buffer, buffer.length,
                    InetAddress.getLocalHost() , 8888);
 
            // 3、发送数据出去
            socket.send(packet);
        }
 
    }
}

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.itheima.d3_udp2;
 
import java.net.DatagramPacket;
import java.net.DatagramSocket;
 
/**
  接收端
 */
public class ServerDemo2 {
    public static void main(String[] args) throws Exception {
        System.out.println("=====服务端启动======");
        // 1、创建接收端对象:注册端口(人)
        DatagramSocket socket = new DatagramSocket(8888);
 
        // 2、创建一个数据包对象接收数据(韭菜盘子)
        byte[] buffer = new byte[1024 * 64];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
 
        while (true) {
            // 3、等待接收数据。
            socket.receive(packet);
            // 4、取出数据即可
            // 读取多少倒出多少
            int len = packet.getLength();
            String rs = new String(buffer,0, len);
            System.out.println("收到了来自:" + packet.getAddress() +", 对方端口是" + packet.getPort() +"的消息:" + rs);
        }
    }
}

=====客户端启动======
请说:
ad
请说:
aldk
请说:
oqiwuieu
请说:

=====服务端启动======
收到了来自:/127.0.0.1, 对方端口是7777的消息:ad
收到了来自:/127.0.0.1, 对方端口是7777的消息:aldk
收到了来自:/127.0.0.1, 对方端口是7777的消息:oqiwuieu

 

posted @   __破  阅读(166)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程使用 AI 从 0 到 1 写了个小工具
· 快收藏!一个技巧从此不再搞混缓存穿透和缓存击穿
· AI 插件第二弹,更强更好用
· Blazor Hybrid适配到HarmonyOS系统
· 支付宝 IoT 设备入门宝典(下)设备经营篇
点击右上角即可分享
微信分享提示