Java UDP协议练习

        UDPExercise1Send

package UDPExercise20240815;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.util.Scanner;

public class UDPExercise1Send {
    public static void main(String[] args) throws IOException {
        // UDP通信程序练习
        // 需求:

        /*
        UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束
        UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
        */

        // 发送端
        Scanner sc = new Scanner(System.in);
        DatagramSocket datagramSocket = new DatagramSocket();
        DatagramPacket datagramPacket;
        byte[] bytes; // 无需分配其大小,Java每次使用时会对其进行动态内存分配,分配一个合理的大小
        while (true) {
            System.out.println("请输入你想要发送的内容:");
            String message = sc.nextLine();
            if (message.equals("886")) {
                bytes = "886".getBytes();
                datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("127.0.0.1"), 10086);
                // 其构造方法:需要一个字节数组代表发送的数据,指出发送多少数据,IP地址,端口号
                datagramSocket.send(datagramPacket);
                break;
            } else {
                bytes = message.getBytes();
                datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("127.0.0.1"), 10086);
                datagramSocket.send(datagramPacket);
            }
        }
        datagramSocket.close();
    }
}

        UDPExercise1Receive

package UDPExercise20240815;

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

public class UDPExercise2Receive {
    public static void main(String[] args) throws IOException {
        // 组播接收端
        // 创建组播接收端的Socket对象(MulticastSocket)
        MulticastSocket multicastSocket = new MulticastSocket(10086);
        // 创建一个箱子用于接收数据
        DatagramPacket datagramPacket = new DatagramPacket(new byte[1024], 1024);
        // 将当前计算机绑定一个组播地址,表示添加到这一组中
        multicastSocket.joinGroup(InetAddress.getByName("224.0.1.0"));
        // 将数据接收到箱子中
        multicastSocket.receive(datagramPacket);
        // 解析数据包并答应数据
        byte[] data = datagramPacket.getData();
        int length = datagramPacket.getLength();
        System.out.println(new String(data, 0, length));
        // 释放资源
        multicastSocket.close();

        // 注:
        // 1.组播地址应该在224.0.0.0 - 239.255.255.255之间,否则是无效的组播地址
        // 2.接收端加入一个组播组,监听特定的组播地址和端口。网络设备(如路由器)会将发送到该组播地址的数据包转发给所有加入该组的接收端。
        // 3.端口共享:多个接收端可以在同一个端口上接收来自同一个组播地址的数据包,而不会产生端口冲突。这是因为组播协议允许多个应用程序在同一个端口上接收数据。

    }
}

        UDPExercise2Send

package UDPExercise20240815;

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

public class UDPExercise2send {
    public static void main(String[] args) throws IOException {
        // UDP有三种通讯方式
        // 1.单播:用于两个主机之间的端对端的通信
        // 2.组播:用于对一组特定主机进行通信
        // 3.广播:用于一个主机对整个局域网上所有主机的数据通信

        // UDP组播实现
        // 步骤:
        // 一、发送端
        // 1.创建发送端的Socket对象(DatagramSocket)
        // 2.创建数据,并将数据打包(DatagramPacket)
        // 3.调用DatagramSocket对象的方法发送数据(单播中是发给指定IP的电脑;但是组播中是发给组播地址)
        // 4.释放资源

        // 二、接收端
        // 1.创建一个接收端的Socket对象(MulticastSocket)
        // 2.创建一个箱子,用于接收数据(单播可以用包,组播需要使用箱子)
        // 3.将当前计算机绑定一个组播的地址
        // 4.将接收的数据放在箱子中
        // 5.解析数据包,并打印数据
        // 6.释放资源

        // 创建发送端的Socket对象(DatagramSocket)
        DatagramSocket datagramSocket = new DatagramSocket();
        String message = "hello 组播";
        byte[] bytes = message.getBytes();
        InetAddress ip = InetAddress.getByName("224.0.1.0");
        int port = 10086;
        // 创建数据,并将数据打包(DatagramPacket)
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, ip, port);
        // 调用方法发送数据
        datagramSocket.send(datagramPacket);
        // 释放资源
        datagramSocket.close();
    }
}

        UDPExercise2Receive

package UDPExercise20240815;

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

public class UDPExercise2Receive {
    public static void main(String[] args) throws IOException {
        // 组播接收端
        // 创建组播接收端的Socket对象(MulticastSocket)
        MulticastSocket multicastSocket = new MulticastSocket(10086);
        // 创建一个箱子用于接收数据
        DatagramPacket datagramPacket = new DatagramPacket(new byte[1024], 1024);
        // 将当前计算机绑定一个组播地址,表示添加到这一组中
        multicastSocket.joinGroup(InetAddress.getByName("224.0.1.0"));
        // 将数据接收到箱子中
        multicastSocket.receive(datagramPacket);
        // 解析数据包并答应数据
        byte[] data = datagramPacket.getData();
        int length = datagramPacket.getLength();
        System.out.println(new String(data, 0, length));
        // 释放资源
        multicastSocket.close();

        // 注:
        // 1.组播地址应该在224.0.0.0 - 239.255.255.255之间,否则是无效的组播地址
        // 2.接收端加入一个组播组,监听特定的组播地址和端口。网络设备(如路由器)会将发送到该组播地址的数据包转发给所有加入该组的接收端。
        // 3.端口共享:多个接收端可以在同一个端口上接收来自同一个组播地址的数据包,而不会产生端口冲突。这是因为组播协议允许多个应用程序在同一个端口上接收数据。

    }
}

         UDPExercise2Receive2

package UDPExercise20240815;

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

public class UDPExercise2Receive2 {
    public static void main(String[] args) throws IOException {
        // 组播接收端
        // 创建组播接收端的Socket对象(MulticastSocket)
        MulticastSocket multicastSocket = new MulticastSocket(10086);
        // 创建一个箱子用于接收数据
        DatagramPacket datagramPacket = new DatagramPacket(new byte[1024], 1024);
        // 将当前计算机绑定一个组播地址,表示添加到这一组中
        multicastSocket.joinGroup(InetAddress.getByName("224.0.1.0"));
        // 将数据接收到箱子中
        multicastSocket.receive(datagramPacket);
        // 解析数据包并答应数据
        byte[] data = datagramPacket.getData();
        int length = datagramPacket.getLength();
        System.out.println(new String(data, 0, length));
        // 释放资源
        multicastSocket.close();

        // 注意:组播地址应该在224.0.0.0 - 239.255.255.255之间,否则是无效的组播地址
    }
}

        UDPExercise3Send

package UDPExercise20240815;

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

public class UDPExercise3Send {
    public static void main(String[] args) throws IOException {
        // 广播实现
        // 发送端
        // 1.创建发送端Socket对象(DatagramSocket)
        // 2.创建存储数据的箱子,将广播地址封装进去
        // 3.发送数据
        // 4.释放资源

        // 接收端
        // 1.创建接收端对象(DatagramSocket)
        // 2.创建一个数据包,用于接收数据
        // 3.调用DatagramSocket对象中的方法接收数据
        // 4.解析数据包,将数据在控制台显示
        // 5.关闭接收端

        // 1.创建发送端Socket对象
        DatagramSocket datagramSocket = new DatagramSocket();
        // 2.创建存储数据的箱子,将广播地址封装进去
        String message = "hello 广播";
        byte[] bytes = message.getBytes();
        InetAddress address = InetAddress.getByName("255.255.255.255");
        int port = 10000;
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, address, port);
        datagramSocket.send(datagramPacket);
        datagramSocket.close();
    }
}

        UDPExercise3Receive

package UDPExercise20240815;

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

public class UDPExercise3Receive {
    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();
    }
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值