Netty学习笔记(一) Hello Netty

Netty是什么?

Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。

 

特性有哪些?

 

1、基于灵活的、可扩展的事件驱动,API适用不同的协议(阻塞和非阻塞),支持TCP和UDP的socket服务开发。

2、高并发、低延时、高吞吐量。

3、简单、安全、可靠、易用。

 

如何使用?

 

废话不多说,请看简单的HelloWorld示例:

服务端

 

  1. package example.echo;  
  2.   
  3. import java.net.InetSocketAddress;  
  4. import java.util.concurrent.Executors;  
  5.   
  6. import org.jboss.netty.bootstrap.ServerBootstrap;  
  7. import org.jboss.netty.channel.ChannelPipeline;  
  8. import org.jboss.netty.channel.ChannelPipelineFactory;  
  9. import org.jboss.netty.channel.Channels;  
  10. import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;  
  11.   
  12. /** 
  13.  * Echoes back any received data from a client. 
  14.  */  
  15. public class TestServer {  
  16.   
  17.     private final int port;  
  18.   
  19.     public TestServer(int port) {  
  20.         this.port = port;  
  21.     }  
  22.   
  23.     public void run() {  
  24.         // Configure the server.  
  25.         ServerBootstrap bootstrap = new ServerBootstrap(  
  26.                 new NioServerSocketChannelFactory(  
  27.                         Executors.newCachedThreadPool(),  
  28.                         Executors.newCachedThreadPool()));  
  29.   
  30.         // Set up the pipeline factory.  
  31.         bootstrap.setPipelineFactory(new ChannelPipelineFactory() {  
  32.             public ChannelPipeline getPipeline() throws Exception {  
  33.                 return Channels.pipeline(new TestServerHandler());  
  34.             }  
  35.         });  
  36.   
  37.         // Bind and start to accept incoming connections.  
  38.         bootstrap.bind(new InetSocketAddress(port));  
  39.     }  
  40.   
  41.     public static void main(String[] args) throws Exception {  
  42.         
  43.         new TestServer(8080).run();  
  44.     }  
  45. }  

服务端处理Handler类:

 
  1. package example.echo;  
  2.   
  3. import java.nio.charset.Charset;  
  4.   
  5. import org.jboss.netty.buffer.ChannelBuffer;  
  6. import org.jboss.netty.buffer.ChannelBuffers;  
  7. import org.jboss.netty.channel.ChannelHandlerContext;  
  8. import org.jboss.netty.channel.ExceptionEvent;  
  9. import org.jboss.netty.channel.MessageEvent;  
  10. import org.jboss.netty.channel.SimpleChannelUpstreamHandler;  
  11.   
  12.   
  13. /** 
  14.  * Handler implementation for the echo server. 
  15.  */  
  16. public class TestServerHandler extends SimpleChannelUpstreamHandler {  
  17.   
  18.     @Override  
  19.     public void messageReceived(  
  20.             ChannelHandlerContext ctx, MessageEvent e) {  
  21.         // Send back the received message to the remote peer.  
  22.         ChannelBuffer acceptBuff = (ChannelBuffer) e.getMessage();  
  23.         String info = acceptBuff.toString(Charset.defaultCharset());  
  24.         if(info != null && !"".equals(info)) {  
  25.             System.out.println("_______服务端接收到>>>>>"+info);  
  26.             ChannelBuffer sendBuff = ChannelBuffers.dynamicBuffer();  
  27.             sendBuff.writeBytes("_______服务端已接收到信息!".getBytes());  
  28.             e.getChannel().write(sendBuff);  
  29.         } else {  
  30.             e.getChannel().write("_______服务端没有接收到信息!");  
  31.         }  
  32.         e.getChannel().close();  
  33.     }  
  34.   
  35.     @Override  
  36.     public void exceptionCaught(  
  37.             ChannelHandlerContext ctx, ExceptionEvent e) {  
  38.         // Close the connection when an exception is raised.  
  39.         e.getCause();  
  40.         e.getChannel().close();  
  41.     }  
  42. }  


客户端:

 
  1. package example.echo;  
  2.   
  3. import java.net.InetSocketAddress;  
  4. import java.util.concurrent.Executors;  
  5.   
  6. import org.jboss.netty.bootstrap.ClientBootstrap;  
  7. import org.jboss.netty.channel.ChannelFuture;  
  8. import org.jboss.netty.channel.ChannelPipeline;  
  9. import org.jboss.netty.channel.ChannelPipelineFactory;  
  10. import org.jboss.netty.channel.Channels;  
  11. import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;  
  12.   
  13. public class TestClient {  
  14.   
  15.     private final String host;  
  16.     private final int port;  
  17.     private final String firstMessageSize;  
  18.   
  19.     public TestClient(String host, int port, String firstMessageSize) {  
  20.         this.host = host;  
  21.         this.port = port;  
  22.         this.firstMessageSize = firstMessageSize;  
  23.     }  
  24.   
  25.     public void run() {  
  26.         // Configure the client.  
  27.         ClientBootstrap bootstrap = new ClientBootstrap(  
  28.                 new NioClientSocketChannelFactory(  
  29.                         Executors.newCachedThreadPool(),  
  30.                         Executors.newCachedThreadPool()));  
  31.   
  32.         // Set up the pipeline factory.  
  33.         bootstrap.setPipelineFactory(new ChannelPipelineFactory() {  
  34.             public ChannelPipeline getPipeline() throws Exception {  
  35.                 return Channels.pipeline(  
  36.                         new TestClientHandler(firstMessageSize));  
  37.             }  
  38.         });  
  39.   
  40.         // Start the connection attempt.  
  41.         ChannelFuture future = bootstrap.connect(new InetSocketAddress(host, port));  
  42.   
  43.         // Wait until the connection is closed or the connection attempt fails.  
  44.         future.getChannel().getCloseFuture().awaitUninterruptibly();  
  45.   
  46.         // Shut down thread pools to exit.  
  47.         bootstrap.releaseExternalResources();  
  48.     }  
  49.   
  50.     public static void main(String[] args) throws Exception {  
  51.           
  52.         new TestClient("127.0.0.1", 8080, "HelloWorld, Welcome to netty!").run();  
  53.     }  
  54. }  


客户端处理Handler类:

 
  1. package example.echo;  
  2.   
  3. import java.nio.charset.Charset;  
  4.   
  5. import org.jboss.netty.buffer.ChannelBuffer;  
  6. import org.jboss.netty.buffer.ChannelBuffers;  
  7. import org.jboss.netty.channel.ChannelHandlerContext;  
  8. import org.jboss.netty.channel.ChannelStateEvent;  
  9. import org.jboss.netty.channel.ExceptionEvent;  
  10. import org.jboss.netty.channel.MessageEvent;  
  11. import org.jboss.netty.channel.SimpleChannelUpstreamHandler;  
  12.   
  13. public class TestClientHandler extends SimpleChannelUpstreamHandler {  
  14.   
  15.     private final String firstMessage;  
  16.   
  17.     /** 
  18.      * Creates a client-side handler. 
  19.      */  
  20.     public TestClientHandler(String firstMessageSize) {  
  21.         firstMessage = firstMessageSize;  
  22.     }  
  23.   
  24.     @Override  
  25.     public void channelConnected(  
  26.             ChannelHandlerContext ctx, ChannelStateEvent e) {  
  27.         ChannelBuffer sendBuff = ChannelBuffers.dynamicBuffer();  
  28.         sendBuff.writeBytes(firstMessage.getBytes());  
  29.           
  30.         e.getChannel().write(sendBuff);  
  31.         System.out.println("_____客户端发送信息完成!");  
  32.     }  
  33.   
  34.     @Override  
  35.     public void messageReceived(  
  36.             ChannelHandlerContext ctx, MessageEvent e) {  
  37.         // Send back the received message to the remote peer.  
  38.         ChannelBuffer acceptBuff = (ChannelBuffer) e.getMessage();  
  39.         String info = acceptBuff.toString(Charset.defaultCharset());  
  40.         System.out.println(info);  
  41.         e.getChannel().close();  
  42.     }  
  43.   
  44.     @Override  
  45.     public void exceptionCaught(  
  46.             ChannelHandlerContext ctx, ExceptionEvent e) {  
  47.         // Close the connection when an exception is raised.  
  48.         e.getCause();  
  49.         e.getChannel().close();  
  50.     }  
  51. }  


运行服务端以及客户端后的控制台输出结果:

服务端:

_______服务端接收到>>>>>HelloWorld, Welcome to netty!

 

客户端:

_____客户端发送信息完成!
_______服务端已接收到信息!

 

你可能感兴趣的:(netty)