-
交互过程
以添加用户信息的交互过程为例:
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此方法为关键方法,获取到了服务端返回的内容信息。