网络---UDP通信

5 篇文章 0 订阅

UDP 用户数据报协议

  • UDP通信协议的特点: 一种无连接的传输层协议,提供面向事务的简单不可靠的信息传送服务。

  • 特点:

    (1) 不可靠的数据传输,数据传输时不会进行事先连接和t释放,可能丢失。

    (2) UDP是无连接的,因此UDP服务端不需要等待客户端的请求以建立连接。发送不管接收方是否准备好,接收方收到也不进行确认;

    (3) UDP服务器为所有通信使用同一套接字,这点与TCP服务器不同,TCP服务器则为每个成功返回的accept()方法创建一个新的套接字。

    (4) 可以广播发送;

    (5) 非常简单的协议,开销小。

  • UDP协议报头:
    在这里插入图片描述

  • UDP协议实现Socket编程

UDP服务端Server:
 
(1) 创建一个DatagramSocket实例,指定本地端口号,并可以有选择地指定本地地址,此时,服务器已经准备好从任何客户端接收数据报文;
(2) 创建一个DatagramPacket实例,即数据包;
(3) 使用DatagramSocket实例的receive()方法接收一个DatagramPacket实例,当receive()方法返回时,数据报文就包含了客户端的地址,这样就知道了回复信息应该发送到什么地方;
(4) 使用DatagramSocket实例的send()方法向服务器端返回DatagramPacket实例。
(5)关闭资源。
UDP客户端Client

(1) 创建一个DatagramSocket实例,可以有选择地对本地地址和端口号进行设置,如果设置了端口号,则客户端会在该端口号上监听从服务器端发送来的数据;
(2) 创建一个DatagramPacket实例,即数据包;
(3) 使用DatagramSocket实例的send()和receive()方法来发送和接收DatagramPacket实例,进行通信;
(4) 通信完成后,调用DatagramSocket实例的close()方法来关闭该套接字。
  • UDP实现CS:
Server:
public static void main(String[] args) throws IOException {
       //创建接收端DatagramSocket 指定端口
        DatagramSocket socket = new DatagramSocket(9999);
        System.out.println("服务端成功启动。。。");
        while (true) {
            //准备容器,封装成DatagramPacket包裹
            byte[] bytes = new byte[1024];
            //3.阻塞式接受包裹receive(DatagramPacket p)
            DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length);
            socket.receive(packet);//阻塞的方法

            byte[] data = packet.getData();//接收到的数据转为字节数组
            String string = new String(data, 0, data.length);
            System.out.println(string);
            if (string.equals("bye")){
                break;
            }
        }
        //关闭资源
        //socket.close();
    }

Client:

 public static void main(String[] args) throws IOException {
        System.out.println("客户端启动中。。。。");
        //创建DatagramSocket实例
        DatagramSocket socket = new DatagramSocket();
        //键盘输入
        System.out.println("客户端给服务端说话 :" );
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String msg = null;
        while ((msg = reader.readLine()) != null) {
         //数据转成字节数组
        //String msg = "我是客户端,你是谁??";
        byte[] bytes = msg.getBytes();
        //封装成DatagramPacket,需要指定目的地,指定地址和端口号
        DatagramPacket packet = new DatagramPacket
                (bytes,0,bytes.length,new InetSocketAddress("192.168.177.1",9999));
            //发送包裹send(DatagramPacket p)
            socket.send(packet);
            if (msg.equals("bye")){
                break;
            }
        }
        //释放资源
        socket.close();
    }
  • TCP和UDP的区别:

TCP:可靠的、面向连接的、流式服务;

UDP:不可靠的、无连接的、数据报服务;

应用场景不同:

TCP适合消息可达性要求较高场景,例:微信;

UDP适合传输效率高,可靠性要求不高的场景,例:视频。

流式服务:数据是一条数据源,数据是没有界限的,发送的次数和接收的次数无直接关系;接收方数据放在缓冲区,数据一次不能接受完,可以放在缓冲区,进行二次读取;

UDP传输:发送的次数和接收的次数是相等的,如果接收端一次未能读取到传输层的数据,剩余的数据则直接丢弃掉;
比如:TCP就像打电话,需要对方接通电话,UDP就像写信,写给十年后的自己,这封信有可能会无法收到,所以是不安全的。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值