7.3 netty3基本使用


由於dubbo默認使用的是netty3進行通信的,這里簡單的列出一個netty3通信的例子。

一 server端

1 Server

 1 package com.hulk.netty.server;
 2 
 3 import org.jboss.netty.bootstrap.ServerBootstrap;
 4 import org.jboss.netty.channel.*;
 5 import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
 6 import org.jboss.netty.handler.codec.string.StringDecoder;
 7 import org.jboss.netty.handler.codec.string.StringEncoder;
 8 
 9 import java.net.InetSocketAddress;
10 import java.util.concurrent.Executors;
11 
12 public class Server {
13     public void start(){
14         ChannelFactory factory = new NioServerSocketChannelFactory(
15                 Executors.newCachedThreadPool(),//boss線程池
16                 Executors.newCachedThreadPool(),//worker線程池
17                 8//worker線程數
18         );
19         ServerBootstrap bootstrap = new ServerBootstrap(factory);
20         /**
21          * 對於每一個連接channel, server都會調用PipelineFactory為該連接創建一個ChannelPipline
22          */
23         bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
24             public ChannelPipeline getPipeline() throws Exception {
25                 ChannelPipeline pipeline = Channels.pipeline();
26                 pipeline.addLast("decoder", new StringDecoder());
27                 pipeline.addLast("encoder", new StringEncoder());
28                 pipeline.addLast("handler", new ServerLogicHandler());
29                 return pipeline;
30             }
31         });
32 
33         Channel channel = bootstrap.bind(new InetSocketAddress("127.0.0.1", 8080));
34         System.out.println("server start success!");
35     }
36 
37     public static void main(String[] args) throws InterruptedException {
38         Server server = new Server();
39         server.start();
40         Thread.sleep(Integer.MAX_VALUE);
41     }
42 }

步驟:

  • 首先創建了NioServerSocketChannelFactory:創建boss線程池,創建worker線程池以及worker線程數。(boss線程數默認為1個)
  • 創建ServerBootstrap server端啟動輔助類
  • 為ServerBootstrap設置ChannelPipelineFactory工廠,並為ChannelPipelineFactory將來創建出的ChannelPipeline設置編碼器/解碼器/事件處理器
  • 使用ServerBootstrap綁定監聽地址和端口

2 事件處理器ServerLogicHandler

 1 package com.hulk.netty.server;
 2 
 3 import org.jboss.netty.channel.Channel;
 4 import org.jboss.netty.channel.ChannelHandlerContext;
 5 import org.jboss.netty.channel.ChannelStateEvent;
 6 import org.jboss.netty.channel.ExceptionEvent;
 7 import org.jboss.netty.channel.MessageEvent;
 8 import org.jboss.netty.channel.SimpleChannelHandler;
 9 
10 public class ServerLogicHandler extends SimpleChannelHandler {
11     @Override
12     public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
13         System.out.println("連接成功, channel: " + e.getChannel().toString());
14     }
15 
16     @Override
17     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
18         String msg = (String) e.getMessage();
19         System.out.println("接收到了client的消息, msg: " + msg);
20 
21         Channel channel = e.getChannel();
22         String str = "hi, client";
23 
24         channel.write(str);//寫消息發給client端
25         System.out.println("服務端發送數據: " + str + "完成");
26     }
27 
28     @Override
29     public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
30         e.getCause().printStackTrace();
31         e.getChannel().close();
32     }
33 }

說明:

  • 監聽與客戶端連接成功事件
  • 監聽接收到來自客戶端的消息,之后寫回給客戶端消息
  • 捕捉異常事件

二 client端

1 Client

 1 package com.hulk.netty.client;
 2 
 3 import org.jboss.netty.bootstrap.ClientBootstrap;
 4 import org.jboss.netty.channel.ChannelFactory;
 5 import org.jboss.netty.channel.ChannelPipeline;
 6 import org.jboss.netty.channel.ChannelPipelineFactory;
 7 import org.jboss.netty.channel.Channels;
 8 import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;
 9 import org.jboss.netty.handler.codec.string.StringDecoder;
10 import org.jboss.netty.handler.codec.string.StringEncoder;
11 
12 import java.net.InetSocketAddress;
13 import java.util.concurrent.Executors;
14 
15 public class Client {
16     public static void main(String[] args) {
17         ChannelFactory factory = new NioClientSocketChannelFactory(
18                 Executors.newCachedThreadPool(),
19                 Executors.newCachedThreadPool(),
20                 8
21         );
22         ClientBootstrap bootstrap = new ClientBootstrap(factory);
23         bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
24             public ChannelPipeline getPipeline() throws Exception {
25                 ChannelPipeline pipeline = Channels.pipeline();
26                 pipeline.addLast("decoder", new StringDecoder());
27                 pipeline.addLast("encoder", new StringEncoder());
28                 pipeline.addLast("handler", new ClientLogicHandler());
29                 return pipeline;
30             }
31         });
32 
33         bootstrap.connect(new InetSocketAddress("127.0.0.1", 8080));
34         System.out.println("client start success!");
35     }
36 }

步驟:(與Server幾乎相同)

  • 首先創建了NioClientSocketChannelFactory:創建boss線程池,創建worker線程池以及worker線程數。(boss線程數默認為1個)
  • 創建ClientBootstrap client端啟動輔助類
  • 為ClientBootstrap設置ChannelPipelineFactory工廠,並為ChannelPipelineFactory將來創建出的ChannelPipeline設置編碼器/解碼器/事件處理器
  • 使用ClientBootstrap連接Server端監聽的地址和端口

2 ClientLogicHandler

 1 package com.hulk.netty.client;
 2 
 3 import org.jboss.netty.channel.ChannelHandlerContext;
 4 import org.jboss.netty.channel.ChannelStateEvent;
 5 import org.jboss.netty.channel.ExceptionEvent;
 6 import org.jboss.netty.channel.MessageEvent;
 7 import org.jboss.netty.channel.SimpleChannelHandler;
 8 import org.jboss.netty.channel.WriteCompletionEvent;
 9 
10 public class ClientLogicHandler extends SimpleChannelHandler {
11     @Override
12     public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
13         System.out.println("客戶端連接成功!");
14         String str = "hi server!";
15         e.getChannel().write(str);//異步
16     }
17 
18     @Override
19     public void writeComplete(ChannelHandlerContext ctx, WriteCompletionEvent e) throws Exception {
20         System.out.println("客戶端寫消息完成");
21     }
22 
23     @Override
24     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
25         String msg = (String) e.getMessage();
26         System.out.println("客戶端接收到消息, msg: " + msg);
27     }
28 
29     @Override
30     public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
31         e.getCause().printStackTrace();
32         e.getChannel().close();
33     }
34 }

說明:

  • 監聽與服務端連接成功事件,連接成功后,寫消息給服務端
  • 監聽向服務端寫消息完成的事件
  • 監聽接收到來自服務端的消息
  • 捕捉異常事件

 

這就是一個簡單的netty3通信的例子,關於netty,后續會讀源碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM