ES-TCPTransport 2 – 自定义ES协议解析

微信扫一扫,分享到朋友圈

ES-TCPTransport 2 – 自定义ES协议解析
  • 目标&材料:
    通过API应用完成信息通信交互;
    代码地址: http://git.oschina.net/walleipt/es-cluster/blob/master/src/main/java/com/waleipt/api/es/tcptransport/Custom_protocol_test.java?dir=0&filepath=src/main/java/com/waleipt/api/es/tcptransport/Custom_protocol_test.java&oid=a41e45021d496650db741a24f29af33aa3a95e7c&sha=02a5634c8de9689ae16ddbf3010b89bd35f257b8
  • 交互过程

    以添加用户信息的交互过程为例:

交互过程

Node-Client发送用户信息给到Node-Server;Node-Server接收到用户信息进行业务处理;然后将执行结果发回给Node-Client;Node-client接收到结果后在进行业务处理;

注意:如上提到的Node-Server和Node-client是在ES中是不会如此划分的,这里主要是为了熟悉和记忆api的使用为之后提炼出需要的api做准备。
  • 代码解析

    添加用户的请求信息:

public class UserRequest extends TransportRequest{
    public int id ;

    public String name ;

    public int age ;
    public UserRequest() {}
    public UserRequest( int id, String name, int age ) {

        this.id = id ;
        this.name = name ;
        this.age = age ;
    }

    @Override
    public void readFrom(StreamInput in) throws IOException {

        // 解码过程

        this.id = in.readInt() ;

        Text text = in.readText() ;

        this.name =  text.toString() ;

        this.age = in.readInt() ;

    }

    @Override
    public void writeTo(StreamOutput out) throws IOException {
        // 编码过程

        out.writeInt( this.id );

        out.writeText( new Text(this.name) );

        out.writeInt( age );

    }

}

添加用户的响应信息:

public class UserResponse extends TransportResponse

    {

        public int status ;
        public String reason ;

        public UserResponse(){}

        public UserResponse( int status, String reason )
        {
            this.status = status ;
            this.reason = reason ;
        }
        @Override
        public void readFrom(StreamInput in) throws IOException {

    //        super.readFrom(in);

    //       解码过程

            this.status = in.readInt() ;
            this.reason = in.readString();
        }

        @Override
        public void writeTo(StreamOutput out) throws IOException 
        {

    //        super.writeTo(out);
    //      编码过程

            out.writeInt( this.status );
            out.writeString( this.reason );
        }

    }

注意:如上请求和响应涉及到传输过程中的编码解码,见注释,本篇之关注两node的通信过程及其API;

对于tcp传输过程中的协议解析(字节码解析)之后在开一篇日志。

  • 启动服务Node:
// 初始化服务端Node

    Server_Node server_node = new Server_Node( 9300 ) ;
    // 注册需要如何处理action_1的请求
    server_node.regHandleRequest( "action_1", UserRequest::new, 
                  (request,channel)->{
                      // 输出请求信息
                      System.err.println( String.format( "处理请求参数:id/name/age:%d/%s/%d", request.id, request.name, request.age ) );

                      // 响应客户端信息
                      channel.sendResponse( new UserResponse( 3, "199999") );

    });
    // 启动服务端
    server_node.start();

regHandleRequest方法定义如何处理action_1这种请求,其中包含3个参数:

action=“action_1”表示请求协议名称,也可以认为是spring mvn中的action

requset=”UserRequest::new”表示接受的请求信息

handlerReuqest=”(request,channel)->{}”表示请求如何处理(这里使用jdk8的函数式语法) ;request是请求信息,channel是连接通道,处理的过程为:打印请求信息,通过channel响应客户端信息

  • 启动客户端Node:
// 初始化客户端
    Client_Node client_node = new Client_Node( 9301 ) ;
    client_node.start();


    // 连接服务端
    client_node.connectToNode( "127.0.0.1", 9300 );


    // 发送请求到服务端
    long requestId = 42 ;
    String action = "action_1" ;
    UserRequest request = new UserRequest( 1, "王五", 23) ;

    client_node.sendRequest(requestId, action, request,
          new TransportResponseHandler() {


          @Override
          public UserResponse newInstance() {
                  return new UserResponse();
          }

          @Override
          public void handleResponse(UserResponse response) {
                   System.err.println( String.format( "处理服务端返回结果:status/reason/:%d/%s", response.status, response.reason ) );                                        
          }


          @Override

          public void handleException(TransportException exp) {
                  // TODO Auto-generated method stub          
          }


          @Override
          public String executor() {
                  return ThreadPool.Names.SAME;
          }

    });

sendRequest方法解析如下:

requestId:请求的序列,多个请求为了区分出不同请求需要此序列号 action:请求的协议名

requset:请求的内容

responseHandler:如何处理服务端返回信息,handleResponse此方法为关键方法,获取到了服务端返回的内容信息。

微信扫一扫,分享到朋友圈

ES-TCPTransport 2 – 自定义ES协议解析

中国联通5月运营数据:4G用户净增562万

上一篇

JavaScript 新手的踩坑日记

下一篇

你也可能喜欢

ES-TCPTransport 2 – 自定义ES协议解析

长按储存图像,分享给朋友