一、我的开发环境

  • eclipse-jee-indigo-SR2-win32-x86_64
  • JDK1.7
  • windows-64
  • netty-all-4.1.1.Final-sources 下载地址:http://netty.io/ ,从【Downloads】选择下载netty-all-4.1.1.Final-sources。
  • 创建一个java工程,选中项目右键Properties->Java Build Path->Add External JARS->将netty-all-4.1.1.Final.jar包导入到项目中

  、Netty服务器端开发

   2.1代码示例

1

 创建服务启动类HttpServer,既然作为服务器它肯定和tomcat服务器一样有个开关来开启/关闭服务器,可以在类中看到有个main函数。对的,它的启动方式就是右键->Run As->Java Application

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. package com.lll.game;  
  2.   
  3. import org.apache.commons.logging.Log;  
  4. import org.apache.commons.logging.LogFactory;  
  5.   
  6. import io.netty.bootstrap.ServerBootstrap;  
  7. import io.netty.channel.ChannelFuture;   
  8. import io.netty.channel.ChannelInitializer;   
  9. import io.netty.channel.ChannelOption;   
  10. import io.netty.channel.EventLoopGroup;   
  11. import io.netty.channel.nio.NioEventLoopGroup;   
  12. import io.netty.channel.socket.SocketChannel;   
  13. import io.netty.channel.socket.nio.NioServerSocketChannel;  
  14.   
  15. public class HttpServer {  
  16.     private static Log log = LogFactory.getLog(HttpServer.class);  
  17.       
  18.     public static void main(String[] args) throws Exception {  
  19.         HttpServer server = new HttpServer();  
  20.         log.info("服务已启动...");  
  21.         server.start(8844);  
  22.     }  
  23.       
  24.     public void start(int port) throws Exception {  
  25.         //配置服务端的NIO线程组  
  26.         EventLoopGroup bossGroup = new NioEventLoopGroup();  
  27.         EventLoopGroup workerGroup = new NioEventLoopGroup();  
  28.         try {  
  29.             ServerBootstrap b = new ServerBootstrap();  
  30.             b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)  
  31.                     .childHandler(new ChannelInitializer<SocketChannel>() {  
  32.                                 @Override  
  33.                                 public void initChannel(SocketChannel ch) throws Exception {  
  34.                                     ch.pipeline().addLast(new ServerHandler());  
  35.                                 }  
  36.                             }).option(ChannelOption.SO_BACKLOG, 128//最大客户端连接数为128  
  37.                     .childOption(ChannelOption.SO_KEEPALIVE, true);  
  38.             //绑定端口,同步等待成功  
  39.             ChannelFuture f = b.bind(port).sync();  
  40.             //等待服务端监听端口关闭  
  41.             f.channel().closeFuture().sync();  
  42.         } finally {  
  43.             //优雅退出,释放线程池资源  
  44.             workerGroup.shutdownGracefully();  
  45.             bossGroup.shutdownGracefully();  
  46.         }  
  47.     }  
  48. }  
2

创建ServerHandler类来负责对网络事件进行读写操作

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. package com.lll.game;  
  2.   
  3. import io.netty.channel.ChannelHandlerAdapter;  
  4. import io.netty.channel.ChannelHandlerContext;  
  5.   
  6. public class ServerHandler extends ChannelHandlerAdapter{  
  7.     @Override  
  8.     public void handlerAdded(ChannelHandlerContext ctx) throws Exception {  
  9.         super.handlerAdded(ctx);  
  10.         System.out.println(ctx.channel().id()+"进来了");  
  11.     }  
  12.       
  13.     @Override  
  14.     public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {  
  15.         super.handlerRemoved(ctx);  
  16.         System.out.println(ctx.channel().id()+"离开了");  
  17.     }  
  18.       
  19. }  
提示:本书作者使用的是netty是用的5.0,我在官方下载的时候只找到4.x包(据说5.0好像已经被官方废弃了)。2个版本相比较,不同版本ChannelHandler申明的方法不一样!!

   2.2 Netty5.x与4.x代码上的差异

  在4.x中,ChannelHandlerAdapter里的channelRead方法在ChannelInboundHandlerAdapter抽象类中,同5.X一样ChannelInboundHandlerAdapter也是基于ChannelHandler接口。这样用户可以方便地进行业务逻辑定制,例如:打印日志、统一封装异常信息、性能统计和消息编码解码等。
ChannelInboundHandlerAdapter的UML图如下:
泰课在线

   2.3 4.x ServerHandler类

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. package com.game.lll.net;  
  2.   
  3. import java.util.Date;  
  4. 标签: Unity
0