ES-TCPTransport 2

来源:互联网 发布:淘宝手机报价 编辑:程序博客网 时间:2024/06/08 12:14
  • 目标&材料
    通过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<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此方法为关键方法,获取到了服务端返回的内容信息。

原创粉丝点击