client部分代碼:ide
//線程 EventLoopGroup worker = new NioEventLoopGroup(); //輔助類 Bootstrap b = new Bootstrap(); //註冊server b.group(worker) .channel(NioSocketChannel.class) .handler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel sc) throws Exception { // TODO Auto-generated method stub sc.pipeline().addLast(new ClientHandler()); } });
clientHandler部分代碼:oop
@Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { // TODO Auto-generated method stub try { ByteBuf buf = (ByteBuf)msg; byte[] bytes = new byte[buf.readableBytes()]; buf.readBytes(bytes); String result = new String(bytes, "utf-8"); System.out.println("Server: " + result); }finally { ReferenceCountUtil.release(msg); } }
下面查看完整代碼 :線程
client:netty
public static void main(String[] args) throws InterruptedException { //線程 EventLoopGroup worker = new NioEventLoopGroup(); //輔助類 Bootstrap b = new Bootstrap(); //註冊server b.group(worker) .channel(NioSocketChannel.class) .handler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel sc) throws Exception { // TODO Auto-generated method stub //不作任何處理,ByteBuf格式傳輸 sc.pipeline().addLast(new ClientHandler()); } }); ChannelFuture cf = b.connect("127.0.0.1", 8765).sync(); cf.channel().writeAndFlush(Unpooled.copiedBuffer("hello netty!!".getBytes())); // Thread.sleep(1000); // cf.channel().writeAndFlush(Unpooled.copiedBuffer("hello netty!!".getBytes())); // Thread.sleep(1000); // cf.channel().writeAndFlush(Unpooled.copiedBuffer("hello netty!!".getBytes())); //發送完畢,斷開鏈接 cf.addListener(ChannelFutureListener.CLOSE); cf.channel().closeFuture().sync(); worker.shutdownGracefully(); }
clientHandler代碼:server
須要繼承:ChannelHandlerAdapter這個類blog
public class ClientHandler extends ChannelHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { // TODO Auto-generated method stub try { //原始ByteBuf數據格式處理 ByteBuf buf = (ByteBuf)msg; byte[] bytes = new byte[buf.readableBytes()]; buf.readBytes(bytes); String result = new String(bytes, "utf-8"); System.out.println("Server: " + result); }finally { //接收處理完後,丟棄 ReferenceCountUtil.release(msg); } } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { // TODO Auto-generated method stub cause.printStackTrace(); ctx.close(); } }
Server代碼:繼承
public static void main(String[] args) throws InterruptedException { //第一個線程鏈接client端 EventLoopGroup boss = new NioEventLoopGroup(); //第二個線程處理邏輯 EventLoopGroup worker = new NioEventLoopGroup(); //輔助類,註冊 server ServerBootstrap b = new ServerBootstrap(); b.group(boss, worker) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel sc) throws Exception { // TODO Auto-generated method stub sc.pipeline().addLast(new ServerHandler()); } }); //綁定指定的端口方便監聽 ChannelFuture cf = b.bind(8765).sync(); cf.channel().closeFuture().sync(); boss.shutdownGracefully(); worker.shutdownGracefully(); }
serverHandler代碼:ip
須要繼承:ChannelHandlerAdapter 類utf-8
public class ServerHandler extends ChannelHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { // TODO Auto-generated method stub ByteBuf buf = (ByteBuf)msg; byte[] bs = new byte[buf.readableBytes()]; buf.readBytes(bs); String result = new String(bs, "utf-8"); System.out.println("Client: " + result); String response = "888888"; ctx.writeAndFlush(Unpooled.copiedBuffer(response.getBytes())); //.addListener(ChannelFutureListener.CLOSE); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { // TODO Auto-generated method stub cause.printStackTrace(); ctx.close(); } }