Netty UDP Server&Client

本文介绍了一个基于Netty的UDP服务器和客户端的实现,包括服务器端接收和处理数据包,以及客户端发送数据的过程。服务器使用NioEventLoopGroup处理I/O事件,通过Bootstrap配置并绑定地址,客户端则创建DatagramSocket发送数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 UDP Server:

package cn.insighters.udp;

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

import java.net.InetAddress;

/**
 * Discards any incoming data.
 */
public class UdpServer {

    private int port;

    public UdpServer(int port) {
        this.port = port;
    }

    public void run() throws Exception {
        final NioEventLoopGroup group = new NioEventLoopGroup();
        try {
            final Bootstrap b = new Bootstrap();
            b.group(group).channel(NioDatagramChannel.class)
                    .option(ChannelOption.SO_BROADCAST, true)
                    .handler(new ChannelInitializer<NioDatagramChannel>() {
                @Override
                public void initChannel(final NioDatagramChannel ch) throws Exception {

                    ChannelPipeline p = ch.pipeline();
                    p.addLast(new IncomingPacketHandler());
                }
            });

            // Bind and start to accept incoming connections.
            InetAddress address  = InetAddress.getLocalHost();
            b.bind(address,port).sync().channel().closeFuture().await();

        } finally {
        System.out.print("In Server Finally");
        }
    }

    public static void main(String[] args) throws Exception {
        final int port = 9956;
        new Thread(new Runnable() {

			@Override
			public void run() {
				 try {
					new UdpServer(port).run();
				} catch (Exception e) {
					e.printStackTrace();
				}
				
			}
        	
        }).start();
       
        for(int i = 0; i < 10; i++) {
        	UdpClient.send("192.168.1.30", port, "" + i + ": " + "{\"command\":\"heartbeat_resp\",\"status\":\"一切正常\"}");
        	try {
        		Thread.sleep(1000);
        	}catch(Exception e) {
        		
        	}
        }
        
    }
}

 

UDP Server Handler:

package cn.insighters.udp;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.socket.DatagramPacket;


import java.net.InetAddress;

public class IncomingPacketHandler extends  SimpleChannelInboundHandler<DatagramPacket> {
    IncomingPacketHandler(){
    }
	@Override
	protected void channelRead0(ChannelHandlerContext arg0, DatagramPacket packet) throws Exception {
        final InetAddress srcAddr = packet.sender().getAddress();
        final int port = packet.sender().getPort();
        final ByteBuf buf = packet.content();
        final int rcvPktLength = buf.readableBytes();
        final byte[] rcvPktBuf = new byte[rcvPktLength];
        buf.readBytes(rcvPktBuf);
        System.out.println("从" + srcAddr.toString() + ":" + port + "收到数据:" + new String(rcvPktBuf));
	}
}

UDP Client:

package cn.insighters.udp;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class UdpClient {
    public static void send(String ip, int port, String content){
        byte[] buf = new byte[256];
        DatagramSocket socket = null;
        try {
            socket = new DatagramSocket();
        } catch (SocketException e) {
            e.printStackTrace();
        }
        InetAddress address = null;
		try {
			address = InetAddress.getByName(ip);
		} catch (UnknownHostException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
        try {
			buf= content.getBytes("UTF-8");
		} catch (UnsupportedEncodingException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
        DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);
        try {
            socket.send(packet);
            System.out.println("发送:" + new String(buf));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

Netty是一个高性能、异步事件驱动的网络应用框架,特别适合用于服务器端开发,包括UDP协议支持。如果你想要在Netty UDP客户端主动向服务器发送数据,你可以按照以下步骤操作: 1. **创建ChannelInitializer**: 创建一个`ChannelInitializer<SocketChannel>`,在这个初始化器中,你需要配置一个`DatagramPacketHandler`来处理收到和发送的数据包。 ```java public class UdpClientHandler extends ChannelInitializer<SocketChannel> { @Override protected void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new DatagramPacketHandler()); } } ``` 2. **创建DatagramPacketHandler**: 这里是关键部分,它会负责封装数据并发送到指定的服务器地址。 ```java class DatagramPacketHandler extends SimpleChannelInboundHandler<DatagramPacket> { private final InetSocketAddress serverAddress; public DatagramPacketHandler(InetSocketAddress serverAddress) { this.serverAddress = serverAddress; } @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { // 发送数据到服务器 sendData(ctx); } private void sendData(ChannelHandlerContext ctx) { byte[] data = ...; // 要发送的数据 DatagramPacket packet = new DatagramPacket(data, data.length, serverAddress); ctx.writeAndFlush(packet); } @Override public void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) { // 处理接收到的响应... } } ``` 3. **启动客户端**: 使用`Bootstrap`配置一个新通道,并设置连接目标和使用自定义的`ChannelInitializer`。 ```java Bootstrap b = new Bootstrap(); b.group(...).channel(NioDatagramChannel.class) .handler(new UdpClientHandler(serverAddress)) .connect(serverAddress) .sync(); // 等待连接建立 // 主动发送数据 sendData(b.channel()); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值