前言介绍
'繁'事都需要一个简单的入门的点,尤其学习程序员行业的知识最快的方式是先运行出helloworld,往往这样一个简单能运行的例子,就能解除你当前遇到的所有疑惑。切记,对于一个初学者,不建议上来就研究理论,实操往往更重要。本章节介绍使用netty端写一个能接收数据的socketServer服务端,通过实现通道适配器ChannelInboundHandlerAdapter.channelRead获取并并解析接收数据。
开发环境
1、jdk1.8【jdk1.7以下只能部分支持netty】
2、Netty4.1.36.Final【netty3.x 4.x 5每次的变化较大,接口类名也随着变化】
3、telnet 测试【可以现在你的win7机器上测试这个命令,用于链接到服务端的测试命令】
代码示例
itstack-demo-netty-1-02 └── src ├── main │ └── java │ └── org.itstack.demo.netty.server │ ├── MyChannelInitializer.java │ ├── MyServerHandler.java │ └── NettyServer.java └── test └── java └── org.itstack.demo.netty.test └── ApiTest.java
MyChannelInitializer.java
/** * 虫洞栈:https://bugstack.cn * 公众号:bugstack虫洞栈 {获取学习源码} * Create by fuzhengwei on 2019 */ public class MyChannelInitializer extends ChannelInitializer<SocketChannel> { @Override protected 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()); } }
MyServerHandler.java
/** * 虫洞栈:https://bugstack.cn * 公众号:bugstack虫洞栈 {获取学习源码} * Create by fuzhengwei on 2019 */ public class MyServerHandler extends ChannelInboundHandlerAdapter { @Override public 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(new Date() + "接收到消息:"); System.out.println(new String(msgByte, Charset.forName("GBK"))); } }
NettyServer.java
/** * 虫洞栈:https://bugstack.cn * 公众号:bugstack虫洞栈 {获取学习源码} * Create by fuzhengwei on 2019 */ public class NettyServer { public static void main(String[] args) { new NettyServer().bing(7397); } private void bing(int port) { //配置服务端NIO线程组 EventLoopGroup parentGroup = new NioEventLoopGroup(); //NioEventLoopGroup extends MultithreadEventLoopGroup Math.max(1, SystemPropertyUtil.getInt("io.netty.eventLoopThreads", NettyRuntime.availableProcessors() * 2)); 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 f = b.bind(port).sync(); System.out.println("itstack-demo-netty server start done. {关注公众号:bugstack虫洞栈,获取源码}"); f.channel().closeFuture().sync(); } catch (InterruptedException e) { e.printStackTrace(); } finally { childGroup.shutdownGracefully(); parentGroup.shutdownGracefully(); } } }
测试结果
启动服务端NettyServer
启动模拟器NetAssist
执行结果
itstack-demo-netty server start done. {关注公众号:bugstack虫洞栈,获取源码} 链接报告开始 链接报告信息:有一客户端链接到本服务端 链接报告IP:127.0.0.1 链接报告Port:7397 链接报告完毕 Mon Aug 05 14:15:32 CST 2019接收到消息:你好,服务端。我是<bugstack虫洞栈>公众号,关注我获取源码。“点发送数据,不需要回车换行” Mon Aug 05 14:15:34 CST 2019接收到消息:你好,服务端。我是<bugstack虫洞栈>公众号,关注我获取源码。“点发送数据,不需要回车换行” Mon Aug 05 14:15:34 CST 2019接收到消息:你好,服务端。我是<bugstack虫洞栈>公众号,关注我获取源码。“点发送数据,不需要回车换行” Mon Aug 05 14:15:35 CST 2019接收到消息:你好,服务端。我是<bugstack虫洞栈>公众号,关注我获取源码。“点发送数据,不需要回车换行” Process finished with exit code -1