Java笔记:UDP基础使用与广播

Posted Naisu Xu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java笔记:UDP基础使用与广播相关的知识,希望对你有一定的参考价值。

文章目录

目的

UDP是比较基础常用的网络通讯方式,这篇文章将介绍Java中UDP基础使用的一些内容。

本文中使用 Packet Sender 工具进行测试,其官网地址如下:
https://packetsender.com/

作为客户端使用

作为客户端使用主要就是向某个服务器发送消息了,主要就是使用 send 方法了。 send 发送一个 DatagramPacket 类型的数据包,数据包中主要包含要发送的数据以及目标地址和端口号。下面是个简单的演示:

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

class UdpTest 
    public static void main(String[] args) throws IOException 
            DatagramSocket udp = new DatagramSocket(); // 创建udp socket对象
            byte[] msg = 0, 1, 2, 3, 4, 5, 6, 7;
            // 发送消息,127.0.0.1是内部回环地址(表示这是发给本机自己的),对方端口号是57500
            DatagramPacket packet = new DatagramPacket(msg, 8, InetAddress.getByName("127.0.0.1"), 57500);
            udp.send(packet); // 发送数据包
            udp.close();
    

另外 DatagramSocket 对象有 connect 方法,可以先记录目标地址和端口号,这样数据包构建的时候就不需要再填写这个信息了。

作为服务器使用

作为服务器使用主要就是监听某个端口号,然后等着接收消息就行。下面是个简单的演示:

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

class UdpTest 
    public static void main(String[] args) throws IOException 
            DatagramSocket udp = new DatagramSocket(22333); // 创建udp socket对象,自身端口号设置为22333(启动监听)
            while (true) 
                byte[] msg = new byte[1024];
                DatagramPacket packet = new DatagramPacket(msg, 1024);
                udp.receive(packet); // 接收数据包,该方法会阻塞在这里直到接收到数据包
                                     // 所以更多时候会用多线程来操作
                System.out.println("From IP:" + packet.getAddress() + " Port:" + packet.getPort() + " Msg:" + (new String(msg)));
            
    

虽然这里是做为服务器使用的,但是 DatagramSocket 对象其实也没那么明确的区分的,想发数据和前面那样发送就行。

广播

广播主要就是指发送时向内网中所有设备发送消息了,操作上最主要就是发送消息时地址使用 广播地址

广播地址获取

下面代码可以获取设备中所有广播地址:

// import java.net.Inet4Address;
// import java.net.InetAddress;
// import java.net.InterfaceAddress;
// import java.net.NetworkInterface;
// import java.net.SocketException;
// import java.util.ArrayList;
// import java.util.Enumeration;
// import java.util.List;

public static List<InetAddress> getBroadcastAddresses() throws SocketException 
    List<InetAddress> list = new ArrayList<>();
    Enumeration<NetworkInterface> enumeration = NetworkInterface.getNetworkInterfaces();

    while (enumeration.hasMoreElements()) 
        NetworkInterface networkInterface = enumeration.nextElement(); // 获取单个网络接口(或者说网卡)
        if (!networkInterface.isUp() || networkInterface.isLoopback() || networkInterface.isVirtual()) 
            // 过滤掉未启用接口、回环接口、虚拟接口 (这些依据自己情况调整)
            continue;
        

        List<InterfaceAddress> interfaceAddresses = networkInterface.getInterfaceAddresses(); // 接口下地址列表
        for (InterfaceAddress interfaceAddress : interfaceAddresses) 
            InetAddress inetAddress = interfaceAddress.getAddress(); // 获取IP地址
            if ((inetAddress == null) || !(inetAddress instanceof Inet4Address)) 
                // 如果地址为空或者非IPv4地址则跳过
                continue;
            
            list.add(interfaceAddress.getBroadcast()); // 将广播地址添加到列表中
        
    
    return list;

广播功能演示


我电脑上有三个符合条件的网络,所以向三个网络中分别发送了消息。

总结

UDP的使用比较简单,这里没有提及的是组播和任意播功能,因为我不太用这两种所以这里也就不介绍了。

以上是关于Java笔记:UDP基础使用与广播的主要内容,如果未能解决你的问题,请参考以下文章

Go语言笔记:UDP基础使用与广播

Node.js笔记:UDP基础使用

Node.js笔记:UDP基础使用

计算机网络学习笔记5-UDP广播

Socket网络编程学习笔记 UDP案例-消息接收回送与局域网广播回送

Socket网络编程学习笔记 UDP辅助TCP实现点对点传输案例 -- UDP广播搜索获取IP/Port