Java 基础教程

Java 面向对象

Java 高级教程

Java 笔记

Java FAQ

java udp接收数据


在 Java 中,你可以使用多种方式来实现 UDP 数据的接收。我将为你介绍两种常见的方式:基于原生 Java 套接字(Socket)的实现和使用第三方库 Netty 的实现。

基于原生 Java 套接字(Socket)的 UDP 接收

步骤流程

  1. 创建 DatagramSocket 对象,用于接收 UDP 数据报。
  2. 创建 DatagramPacket 对象,用于存储接收到的数据。
  3. 使用 receive() 方法接收数据,此方法将阻塞直到有数据包到达。
  4. 处理接收到的数据。
  5. 关闭 DatagramSocket

示例代码

import java.net.DatagramSocket;
import java.net.DatagramPacket;

public class UDPServer {
    public static void main(String[] args) {
        try {
            DatagramSocket socket = new DatagramSocket(9876); // 监听端口9876

            byte[] buffer = new byte[1024];
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

            System.out.println("Server listening...");

            socket.receive(packet); // 阻塞等待数据接收

            String receivedData = new String(packet.getData(), 0, packet.getLength());
            System.out.println("Received data: " + receivedData);

            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

依赖坐标:无需额外依赖,使用 Java 标准库。

使用 Netty 库实现 UDP 接收

Netty 是一个高性能的网络编程库,它提供了简化网络应用开发的工具和组件。

步骤流程

  1. 添加 Netty 的依赖。
  2. 创建 Bootstrap 实例。
  3. 配置 Bootstrap,指定事件处理器和其他参数。
  4. 绑定端口并启动服务器。
  5. 在事件处理器中处理接收到的数据。

Maven 依赖

<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
    <version>4.1.68.Final</version>
</dependency>

Gradle 依赖

implementation 'io.netty:netty-all:4.1.68.Final'

示例代码

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.DatagramChannel;
import io.netty.channel.socket.nio.NioDatagramChannel;

public class UDPServerNetty {
    public static void main(String[] args) {
        EventLoopGroup group = new NioEventLoopGroup();

        try {
            Bootstrap bootstrap = new Bootstrap();
            bootstrap.group(group)
                     .channel(NioDatagramChannel.class)
                     .option(ChannelOption.SO_BROADCAST, true)
                     .handler(new ChannelInitializer<DatagramChannel>() {
                         @Override
                         protected void initChannel(DatagramChannel ch) throws Exception {
                             ch.pipeline().addLast(new UDPHandler());
                         }
                     });

            bootstrap.bind(9876).sync().channel().closeFuture().await();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            group.shutdownGracefully();
        }
    }
}
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

public class UDPHandler extends SimpleChannelInboundHandler<DatagramPacket> {
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet) throws Exception {
        String receivedData = packet.content().toString(Charset.forName("UTF-8"));
        System.out.println("Received data: " + receivedData);
    }
}

这两种方法都可以用来实现 UDP 数据的接收,你可以根据你的需求和偏好选择其中之一。

在Java中,使用UDP(UserDatagramProtocol)发送和接收数据是一种非连接、无状态的网络通信方式。###方式一:使用纯J ...
请注意,UDP是一种无连接的协议,因此在使用UDP传输文件时需要考虑数据完整性和可靠性的问题。###方式一:基本UDP传输这种方式通过UDP ...
下面我将介绍几种不同的方式来实现JavaUDP广播的接收和发送,包括步骤流程和示例代码。###使用Java的原生Socket类实现UDP广播 ...
Java 没有内置的字符串类型,而是在标准 Java 类库中提供了一个预定义类,很自然地叫做 String。每个用双引号括起来的字符串都是 ...
在Java中使用Redis主要涉及使用Redis客户端库来与Redis服务器进行通信。步骤流程:添加Maven依赖:编写Java代码示例:# ...