1、maven項目添加netty的jar
2、自定義一個類處理服務器接收到的消息,該類主要是實現了接收客戶端發來的消息,並輸出到控制檯。
package com.coder.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; /** * 輸出接收到的消息 * @author Coder * */ public class HelloServerHandler extends ChannelInboundHandlerAdapter { /** * 收到數據時調用 */ @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { try { ByteBuf in = (ByteBuf)msg; System.out.print(in.toString(CharsetUtil.UTF_8)); } finally { // 拋棄收到的數據 ReferenceCountUtil.release(msg); } // ctx.write(msg); // ctx.flush(); } /** * 當Netty由於IO錯誤或者處理器在處理事件時拋出異常時調用 */ @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { // 當出現異常就關閉連接 cause.printStackTrace(); ctx.close(); } }
3、然後我們就能實現一個簡單的服務端程序了
Netty 服務器的通信步驟爲:
package com.coder.server; 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 HelloServer { private int port; public HelloServer(int port) { this.port = port; } public void run() throws Exception { EventLoopGroup bossGroup = new NioEventLoopGroup(); // 用來接收進來的連接 EventLoopGroup workerGroup = new NioEventLoopGroup(); // 用來處理已經被接收的連接 System.out.println("準備運行端口:" + port); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) // 這裏告訴Channel如何接收新的連接 .childHandler( new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { // 自定義處理類 ch.pipeline().addLast(new HelloServerHandler()); } }) .option(ChannelOption.SO_BACKLOG, 128) .childOption(ChannelOption.SO_KEEPALIVE, true); // 綁定端口,開始接收進來的連接 ChannelFuture f = b.bind(port).sync(); // 等待服務器socket關閉 f.channel().closeFuture().sync(); } catch (Exception e) { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } } public static void main(String[] args) throws Exception { int port = 10110; new HelloServer(port).run(); } }
二、測試
我們可以去自定義客戶端程序,這裏爲了方便使用 telnet 充當客戶端。
需要注意的是,Windows 默認是沒有開啓 telnet 客戶端的,需要我們手動開啓。
菜單->控制面板->程序->打開或關閉Windows功能,設置如圖: