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

交互过程
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<UserResponse>() {


          @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此方法为关键方法,获取到了服务端返回的内容信息。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值