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此方法为关键方法,获取到了服务端返回的内容信息。
阅读全文
0 0
- ES-TCPTransport 2
- ES-TCPTransport 1
- ES-TCPTransport 3
- es弊端2
- 学习OpenGL-ES: 2
- 学习OpenGL-ES: 2
- es
- es
- es
- es
- ES
- es
- es
- es
- es
- ES
- es
- Android OpenGL ES 开发教程(2):关于OpenGL ES
- ROS机器人操作系统的安装、配置与初级教程 1
- 二叉查找树的简单实现
- ffmpeg参数解释--中文详细
- .html().text().val() 三者的区别
- 堆栈到底是个什么东西?
- ES-TCPTransport 2
- POJ1979 Red and Black (DFS)
- Git学习总结(16)——开源世界GitHub和开源中国GitOSChina同步提交
- 什么是能力
- TOEFL essay practice
- 无数据接口及api的情况下,自行进行系统对接的一种方法
- CentOS 6.5 安装 Redis
- Android Activity的onDestroy方法不一定任何时候都会执行!!!
- Caffe实例开发学习笔记。——网络配置文件 Layer参数详解——