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();
    }
}

Java笔记:UDP基础使用与广播_第1张图片

另外 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)));
            }
    }
}

Java笔记:UDP基础使用与广播_第2张图片

虽然这里是做为服务器使用的,但是 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的使用比较简单,这里没有提及的是组播和任意播功能,因为我不太用这两种所以这里也就不介绍了。

你可能感兴趣的:(编程相关,udp,java,网络协议,广播,android)