netty tcp udp监听同一端口


前言

经常写tcp,最近需求突然要搞udp和tcp监听同一端口号。


一、tcp和udp区别

TCP 是面向连接的,UDP 是面向无连接的
UDP程序结构较简单
TCP 是面向字节流的,UDP 是基于数据报的
TCP 保证数据正确性,UDP 可能丢包
TCP 保证数据顺序,UDP 不保证

二、netty创建服务

1.tcp服务

代码如下(示例):


public class TcpServer {
   
 
    public static void main(String[] args) throws Exception {
   
        //创建bossGroup,workGroup
        //bossGroup只处理连接请求,真正的和客户的业务处理会交给workGroup完成
        // 两个都是无限循环
        //bossGroup,workerGroup含有的子线程(NioEventLoopGroup)默认有cpu核数*2
        // 指定bossgroup一个线程
        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
   
            // 创建服务器端的启动对象,配置参数
            ServerBootstrap bootstrap = new ServerBootstrap();
            bootstrap.group(bossGroup, workerGroup)//设置两个线程组
                    .channel(NioServerSocketChannel.class)//服务器端通道
                    .option(ChannelOption.SO_BACKLOG, 128)//设置线程队列得到的连接数
                    .childOption(ChannelOption.SO_KEEPALIVE, true)//设置保持活动链接状态
                    .childHandler(new ChannelInitializer<SocketChannel>() {
   //匿名创建一个测试对象
                        //给pipeline设置处理器
                        @Override
                        protected void initChannel(SocketChannel socketChannel) {
   
                            //给我们的workerGroup的EventLoop对应的管道设置处理器
                            socketChannel.pipeline().addLast(new NettyServerHandler());
                        }
                    });
            System.out.println("........tcp服务监听启动.....");
            // 绑定一个端口并且同步,生成一个channelFuture对象
            //启动服务器并绑定端口
            ChannelFuture cf = bootstrap.bind(
### 使用Netty实现TCPUDP通信 #### TCP通信实例 为了使用Java中的Netty框架建立TCP服务器,需创建一个`ServerBootstrap`对象配置NIO线程组、处理器链其他必要的参数。 ```java import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; public class TcpServer { public static void main(String[] args) throws Exception { EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new SimpleChatServerInitializer()); ChannelFuture f = b.bind(8080).sync(); f.channel().closeFuture().sync(); } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } } } ``` 此代码片段展示了如何设置并启动基于NettyTCP服务器[^4]。其中`SimpleChatServerInitializer`用于初始化通道管道,添加各种编解码器服务端处理程序至`ChannelPipeline`上。 对于客户端部分,则应构建`Bootstrap`而非`ServerBootstrap`,并且指定远程主机地址与端口进行连接操作。 #### UDP通信实例 当涉及到UDP广播时,由于其无连接性质,在发送消息前不需要显式的连接过程。下面是一个简单的UDP广播接收者的例子: ```java import io.netty.bootstrap.Bootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.DatagramPacket; import io.netty.channel.socket.nio.NioDatagramChannel; public class UdpReceiver { private final int port; public UdpReceiver(int port){ this.port=port; } public void run() throws InterruptedException{ EventLoopGroup group=new NioEventLoopGroup(); Bootstrap bootstrap=new Bootstrap() .group(group) .channel(NioDatagramChannel.class) .option(ChannelOption.SO_BROADCAST,true)//允许广播 .handler(new ChannelInitializer<NioDatagramChannel>() { @Override protected void initChannel(NioDatagramChannel ch)throws Exception { ch.pipeline().addLast(new StringDecoder(),new EchoServerHandler()); } }); Channel channel=bootstrap.bind(port).sync().channel(); System.out.println("Udp Receiver started on "+port); channel.closeFuture().await(); group.shutdownGracefully(); } //自定义的消息处理逻辑 public static class EchoServerHandler extends SimpleChannelInboundHandler<DatagramPacket> { @Override protected void messageReceived(ChannelHandlerContext ctx,DatagramPacket packet) throws Exception { System.out.println(packet.content().toString(CharsetUtil.UTF_8)); } } } ``` 上述代码实现了监听特定端口号上的所有传入UDP数据报,并打印接收到的内容。注意这里启用了SO_BROADCAST选项以便能够接受来自其他设备发出的广播信息[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛雪的小商店

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值