Java网络编程(二)之UDP

UDP

UDP发送数据

构造方法

相关方法

发送数据的步骤  

UDP接收数据

构造方法

相关方法

接收数据的步骤

代码实现

UDP通信程序练习

案例需求

代码实现

UDP三种通讯方式

UDP组播实现

实现步骤

代码实现

UDP广播实现

实现步骤


UDP

UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象,但是这两个Socket只是发送,接收数据的对象,因此对于基于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念

Java提供了DatagramSocket类作为基于UDP协议的Socket

UDP发送数据

构造方法

方法名说明
DatagramSocket()创建数据报套接字并将其绑定到本机地址上的任何可用端口
DatagramPacket(byte[] buf,int len,InetAddress add,int port)创建数据包,发送长度为len的数据包到指定主机的指定端口

相关方法

方法名说明
void send(DatagramPacket p)发送数据报包
void close()关闭数据报套接字
void receive(DatagramPacket p)从此套接字接受数据报包

发送数据的步骤  

UDP接收数据

构造方法

方法名说明
DatagramPacket(byte[] buf, int len)创建一个DatagramPacket用于接收长度为len的数据包

相关方法

方法名说明
byte[] getData()返回数据缓冲区
int getLength()返回要发送的数据的长度或接收的数据的长度

接收数据的步骤

  • 创建接收端的Socket对象(DatagramSocket)

  • 创建一个数据包,用于接收数据

  • 调用DatagramSocket对象的方法接收数据

  • 解析数据包,并把数据在控制台显示

  • 关闭接收端

代码实现

接收端ServerDemo01

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

        //2.创建一个数据包,用于接收数据
        byte[] bytes = new byte[1024];

        //3.调用DatagramSocket对象的方法接收数据
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length);

        //4.解析数据包,并把数据在控制台显示
        ds.receive(dp);
        byte[] data = dp.getData();
        System.out.println(new String(data));

        //5.关闭接收端
        ds.close();
    }
}

发送端ClientDemo01

public class ClientDemo01 {
    public static void main(String[] args) throws IOException {
        //1.创建发送端的Socket对象(DatagramSocket)
        //使用空参 - 表示随机使用一个
        DatagramSocket ds = new DatagramSocket();

        //2.创建数据,并把数据打包
        //DatagramPacket(byte[] buf,int len,InetAddress add,int port)
        String s = "发送:我的第一个网络程序";
        byte[] bytes = s.getBytes();
        InetAddress address = InetAddress.getByName("127.0.0.1");
        int port = 10000;
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);

        //3.调用DatagramSocket对象的方法发送数据
        ds.send(dp);

        //4.关闭发送端
        ds.close();
    }
}

注意一定要先运行ServerDemo01,然后再运行ClientDemo01,在ServerDemo01的控制台打印UDP传输的数据。 

UDP通信程序练习

案例需求

UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束

UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收

代码实现

接收端ServerDemo02

//接受端
public class ServerDemo02 {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket(10000);

        while(true) {
            byte[] bytes = new byte[1024];

            DatagramPacket dp = new DatagramPacket(bytes,bytes.length);

            ds.receive(dp);

            byte[] data = dp.getData();
            int length = dp.getLength();
            System.out.println("接收到的内容是:");
            System.out.println(new String(data,0,length));
        }
        //ds.close();
    }
}

发送端ClientDemo02

//发送端
public class ClientDemo02 {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        DatagramSocket ds = new DatagramSocket();

        while(true) {
            System.out.println("请输入你将要发送的内容:");
            String s = sc.nextLine();
            if("886".equals(s)){
                break;
            }
            byte[] bytes = s.getBytes();
            InetAddress address = InetAddress.getByName("127.0.0.1");
            int port = 10000;
            DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
            ds.send(dp);
        }
        ds.close();
    }
}

UDP三种通讯方式

  • 单播

    单播用于两个主机之间的端对端通信(点对点传输)

  • 组播

    组播用于对一组特定的主机进行通信

  • 广播

    广播用于一个主机对整个局域网上所有主机上的数据通信

UDP组播实现

组播的发送端跟单播是类似的,区别在于接收端!

实现步骤

  • 发送端

  1. 创建发送端的Socket对象(DatagramSocket)
  2. 创建数据,并把数据打包(DatagramPacket)
  3. 调用DatagramSocket对象的方法发送数据(在单播中,这里是发给指定IP的电脑,但是在组播当中,这里是发给组播地址)
  4. 释放资源
  • 接收端

  1. 创建接收端Socket对象(MulticastSocket)
  2. 创建一个箱子,用于接收数据
  3. 把当前计算机绑定一个组播地址
  4. 将数据接收到箱子中
  5. 解析数据包,并打印数据
  6. 释放资源

代码实现

接收端

//接收端
public class ServerDemo03 {
    public static void main(String[] args) throws IOException {
        MulticastSocket ms = new MulticastSocket(10000);

        DatagramPacket dp = new DatagramPacket(new byte[1024],1024);

        //把当前计算机绑定一个组播地址,表示添加到这一组中
        ms.joinGroup(InetAddress.getByName("224.0.1.0"));

        ms.receive(dp);

        byte[] data = dp.getData();
        int length = dp.getLength();
        System.out.println(new String(data,0,length));
        ms.close();
    }
}

发送端

public class ClientDemo03 {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket();

        String s = "Hello 组播!";
        byte[] bytes = s.getBytes();
        InetAddress address = InetAddress.getByName("224.0.1.0");
        int port = 10000;

        DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);

        ds.send(dp);

        ds.close();
    }
}

UDP广播实现

实现步骤

发送端

  • 创建发送端Socket对象(DatagramSocket)
  • 创建存储数据的箱子,将广播地址封装进去
  • 发送数据
  • 释放资源

接收端

  • 创建接收端的Socket对象(DatagramSocket)
  • 创建一个数据包,用于接收数据
  • 调用DatagramSocket对象的方法接收数据
  • 解析数据包,并把数据在控制台显示
  • 关闭接收端

在广播中,地址都是255.255.255.255

发送端

// 发送端
public class ClientDemo {
    public static void main(String[] args) throws IOException {
      	// 1. 创建发送端Socket对象(DatagramSocket)
        DatagramSocket ds = new DatagramSocket();
		// 2. 创建存储数据的箱子,将广播地址封装进去
        String s = "广播 hello";
        byte[] bytes = s.getBytes();
        InetAddress address = InetAddress.getByName("255.255.255.255");
        int port = 10000;
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
		// 3. 发送数据
        ds.send(dp);
		// 4. 释放资源
        ds.close();
    }
}

接收端

// 接收端
public class ServerDemo {
    public static void main(String[] args) throws IOException {
        // 1. 创建接收端的Socket对象(DatagramSocket)
        DatagramSocket ds = new DatagramSocket(10000);
        // 2. 创建一个数据包,用于接收数据
        DatagramPacket dp = new DatagramPacket(new byte[1024],1024);
        // 3. 调用DatagramSocket对象的方法接收数据
        ds.receive(dp);
        // 4. 解析数据包,并把数据在控制台显示
        byte[] data = dp.getData();
        int length = dp.getLength();
        System.out.println(new String(data,0,length));
        // 5. 关闭接收端
        ds.close();
    }
}
posted @   金鳞踏雨  阅读(27)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2020-02-09 Django框架——虚拟环境的使用
点击右上角即可分享
微信分享提示