首页 > 代码库 > Netty4.X 学习(一)
Netty4.X 学习(一)
Server:
import io.netty.buffer.ByteBuf;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.ChannelInboundHandlerAdapter;import io.netty.util.CharsetUtil;import io.netty.util.ReferenceCountUtil;import com.netty.utils.*;public class HelloServerHandler extends ChannelInboundHandlerAdapter { @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { Log.logInfo(">>>>>> I‘m server."); // System.out.println(">>>>>> I‘m server."); String msg = "Hello world\n"; ByteBuf encoded = ctx.alloc().buffer(msg.length()); encoded.writeBytes(msg.getBytes()); ctx.write(encoded); ctx.flush(); } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { //Log.logInfo("server receive message:" + msg); // System.out.println("服务器收到的消息:" + msg); ByteBuf in = (ByteBuf) msg; try { if (in.isReadable()) { // (1) String str = in.toString(CharsetUtil.US_ASCII); Log.logInfo("server receive message:" + str); } } finally { ReferenceCountUtil.release(msg); // (2) } }}
package com.netty.example.PrintHello;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;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.SocketChannel;import io.netty.channel.socket.nio.NioServerSocketChannel;public class HelloWorldServer { public static void main(String[] args) { //EventLoop 代替原来的 ChannelFactory EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap serverBootstrap = new ServerBootstrap(); // server端采用简洁的连写方式,client端才用分段普通写法。 serverBootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new HelloServerHandler()); } }).option(ChannelOption.SO_KEEPALIVE, true); ChannelFuture f = serverBootstrap.bind(8000).sync(); f.channel().closeFuture().sync(); System.out.println("TCP服务器已启动"); } catch (InterruptedException e) { } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } }}
运行后可以在终端直接通过telnet命令连接:
telnet localhost 8000
client:
package com.netty.example.PrintHello;import io.netty.buffer.ByteBuf;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.ChannelInboundHandlerAdapter;import io.netty.util.ReferenceCountUtil;public class HelloClientHandler extends ChannelInboundHandlerAdapter{ @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { System.out.println(">>>>> I‘m client.");// ctx.write("Hello world!");// ctx.flush(); String msg = "Are you ok?"; ByteBuf encoded = ctx.alloc().buffer(msg.length()); encoded.writeBytes(msg.getBytes()); ctx.write(encoded); ctx.flush(); } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception{ ByteBuf in = (ByteBuf) msg; try { while (in.isReadable()) { // (1) System.out.println("client收到服务器的消息:" + msg); System.out.print((char) in.readByte()); System.out.flush(); } } finally { ReferenceCountUtil.release(msg); // (2) } }}
package com.netty.example.PrintHello;import java.net.InetSocketAddress;import io.netty.bootstrap.Bootstrap;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.ChannelInboundHandlerAdapter;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.SocketChannel;import io.netty.channel.socket.nio.NioServerSocketChannel;import io.netty.channel.socket.nio.NioSocketChannel;public class HelloWorldClient { public static void main(String[] args) { // Client服务启动器 3.x的ClientBootstrap 改为Bootstrap,且构造函数变化很大,这里用无参构造。 Bootstrap bootstrap = new Bootstrap(); // 指定channel类型 bootstrap.channel(NioSocketChannel.class); // 指定Handler bootstrap.handler(new HelloClientHandler()); // 指定EventLoopGroup bootstrap.group(new NioEventLoopGroup()); // 连接到本地的8000端口的服务端 bootstrap.connect(new InetSocketAddress("127.0.0.1", 8000)); }}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。