UDP通信程序

UDP协议简介

  • 用户数据报协议(User Datagram Protocol)
  • UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。
  • 由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输
  • 例如视频会议通常采用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议

案例演示

分别模拟使用UDP协议发送和接收数据的两个设备,发送端数据由键盘录入,发送给接收端。接收端接收到数据,打印到控制台。效果如下:
发送端输入:
你好!
UDP
over

接收端显示:
127.0.0.1说:你好!
127.0.0.1说:UDP

发送端代码

 import java.io.IOException;
    import java.net.*;
    import java.util.Scanner;
    
    public class Send {
        public static void main(String[] args) throws IOException {
            //创建发送端的Socket对象(DatagramSocket)
            // DatagramSocket​() 构造数据报套接字并将其绑定到本地主机上的任何可用端口
            DatagramSocket ds=new DatagramSocket();
            while (true){
                System.out.println("请输入想要发送的信息:");
                Scanner sc=new Scanner(System.in);
                //键盘录入想要发送的信息,以"over"结束
                String s=sc.nextLine();
                if (s.equals("over")){
                    break;
                }
                byte[] bytes=s.getBytes();
                // 打包数据(字节数据,字节数据长度,发送目的主机地址,端口号)
                //127.0.0.1表示本机ip地址
                DatagramPacket dp=new DatagramPacket(bytes,bytes.length,InetAddress.getByName("127.0.0.1"),8888);
                //调用DatagramSocket对象的send方法发送数据
                ds.send(dp);
            }
            //关闭发送端
            ds.close();
        }
    }

接收端代码

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

public class Receive {
    public static void main(String[] args) throws IOException {
        // 创建接收端的Socket对象,指定接收的端口号
        DatagramSocket ds=new DatagramSocket(8888);
        while (true){
            // 创建一个数据包,用于接收数据
            byte[] bytes=new byte[1024];
            DatagramPacket dp=new DatagramPacket(bytes,bytes.length);
            // 接收数据
            ds.receive(dp);
            // 获取发送者ip
            InetAddress inetAddress = dp.getAddress();
            String host = "未知IP";
            if (inetAddress != null) {
                host = inetAddress.getHostAddress();
            }
            // 解析数据包
            byte[] datas = dp.getData(); // 数据包中的字节数据
            int len = dp.getLength(); // 数据有效长度
            System.out.println(host+" 说: "+new String(datas,0,len));
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值