文章目录
- 一、前言介绍
- 二、代码实现
- 2.1 工程结构
- 2.2 Netty服务端接收数据实现
- 2.2.1 服务端处理器
- 2.2.2 通道初始化
- 2.2.3 netty服务端
- 2.3 单元测试
一、前言介绍
💡 介绍使用 netty 写一个能接收数据的 socketServer 服务端。
- 通过实现通道适配器
ChannelInboundHandlerAdapter.channelRead
获取并解析接收数据。
二、代码实现
2.1 工程结构
netty-1.0-03
|-src|-main|-java|-com.lino.netty.server|-MyChannelInitializer.java|-MyServerHandler.java|-NettyServer.java
2.2 Netty服务端接收数据实现
2.2.1 服务端处理器
MyServerHandler.java
package com.lino.netty.server;import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import java.nio.charset.Charset;
import java.time.LocalDateTime;/*** @description: 服务端处理器*/
public class MyServerHandler extends ChannelInboundHandlerAdapter {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {// 接收msg消息ByteBuf buf = (ByteBuf) msg;byte[] msgByte = new byte[buf.readableBytes()];buf.readBytes(msgByte);System.out.print(LocalDateTime.now() + " 接收到消息:");System.out.println(new String(msgByte, Charset.forName("GBK")));}
}
2.2.2 通道初始化
MyChannelInitializer.java
package com.lino.netty.server;import io.netty.channel.ChannelInitializer;
import io.netty.channel.socket.SocketChannel;/*** @description: 通道初始化*/
public class MyChannelInitializer extends ChannelInitializer<SocketChannel> {@Overrideprotected void initChannel(SocketChannel channel) {System.out.println("链接报告开始");System.out.println("链接报告信息:有一客户端链接到本服务端");System.out.println("链接报告IP:" + channel.localAddress().getHostString());System.out.println("链接报告Port:" + channel.localAddress().getPort());System.out.println("链接报告完毕");// 在管道中添加接收数据实现方法channel.pipeline().addLast(new MyServerHandler());}
}
- 添加接收数据实现方法。
2.2.3 netty服务端
NettyServer.java
package com.lino.netty.server;import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;/*** @description: netty服务端*/
public class NettyServer {public static void main(String[] args) {new NettyServer().bind(7397);}/*** 开启链接** @param port 端口*/private void bind(int port) {// 配置服务端NIO线程组// NioEventLoopGroup extends MultithreadEventLoopGroup// Math.max(1, SystemPropertyUtil.getInt("io.netty.eventLoopThreads", NettyRuntime.availableProcessors() * 2));EventLoopGroup parentGroup = new NioEventLoopGroup();EventLoopGroup childGroup = new NioEventLoopGroup();try {ServerBootstrap b = new ServerBootstrap();b.group(parentGroup, childGroup)// 非阻塞模式.channel(NioServerSocketChannel.class).option(ChannelOption.SO_BACKLOG, 128).childHandler(new MyChannelInitializer());ChannelFuture future = b.bind(port).sync();System.out.println("lino-learn-netty server start done.");future.channel().closeFuture().sync();} catch (InterruptedException e) {e.printStackTrace();} finally {childGroup.shutdownGracefully();parentGroup.shutdownGracefully();}}
}
2.3 单元测试
启动NettyServer
lino-learn-netty server start done.
链接报告开始
链接报告信息:有一客户端链接到本服务端
链接报告IP:192.168.80.1
链接报告Port:7397
链接报告完毕
2023-02-17T16:55:55.122 接收到消息:你好,netty服务端!
2023-02-17T16:55:56.263 接收到消息:你好,netty服务端!
2023-02-17T16:55:56.983 接收到消息:你好,netty服务端!
2023-02-17T16:55:57.671 接收到消息:你好,netty服务端!
网络调试助手