现在很多应用服务器都是网络通信的服务器,提供一个远程通信模块是Beetle应用服务程序框架的一直心愿。虽然目前市场有很多这方面的框架产品,如:Grizzly、Mina和Netty等,但它们定位为大而全,结构复杂,学习周期长。Beetle1.3.6版本开始,提供一个remoting远程通信模块,它完全基于消息且结构和使用都十分简单。其主要的功能特点为:
n 基于NIO的多线程服务器实现,性能优秀
n 完全基于网络消息对象传递,没有数据格式限制,便于扩展
n 支持基于用户名和密码的网络服务器验证
n 客户端支持同步、异步方法调用,消息发送和接收
n服务器Session管理,向客户端消息推送
远程通信模块相关主要类图如下:
从上图可知,MessageServer是服务器实现,IRequestHandler是服务端对客户端请求的处理接口,其包含两个方法:
1,handle(req : MsgReq) : MsgRes,负责处理请求,其输入为MsgReq消息,返回为MsgRes消息,它们共同继承自BaseDTO基础类。
2,authenticate(username : String, password : String) : boolean,客户端验证方法。参数为客户端发送上来的用户名和密码,通过此方法开发人员可以根据自己需要对其做验证处理。
MessageClient是客户端实现,提供了创建连接、关闭连接、消息发送、接收,方法调用等功能。可见,Beetle的remoting通信模块相对哪些动不动几百类实现的框架来说,其结构十分简单,但功能却十分强大。下面实现一个简单的Echo服务器例子以便说明:
(1),编写请求处理EchoServerHandler
package example.appsrv.remoting;
import com.beetle.framework.appsrv.remoting.MessageCommunicateException;
import com.beetle.framework.appsrv.remoting.MessageServer;
import com.beetle.framework.appsrv.remoting.MsgReq;
import com.beetle.framework.appsrv.remoting.MsgRes;
public class EchoServerHandler implements MessageServer.IRequestHandler {
public boolean authenticate(String username, String password) {
if (username.equals("Henry") && password.equals("888888")) {
return true;
}
return false;
}
public MsgRes handle(MsgReq req) throws MessageCommunicateException {
String word = req.getValueAsString("word");
System.out.println("[" + System.currentTimeMillis() + "]:" + word);
MsgRes res = new MsgRes();
res.setValueWithString("echo", "echo:" + word);
return res;
}
}
(2),编写EchoServer服务器:
package example.appsrv.remoting;
import com.beetle.framework.appsrv.remoting.MessageServer;
public class EchoServer {
public static void main(String[] args) {
MessageServer ms = new MessageServer(8080);
ms.registerRequestHandler(new EchoServerHandler());
ms.start();
}
}
(3),编写EchoClient客户端:
package example.appsrv.remoting;
import com.beetle.framework.appsrv.remoting.MessageClient;
import com.beetle.framework.appsrv.remoting.MsgReq;
import com.beetle.framework.appsrv.remoting.MsgRes;
public class EchoClient {
public static void main(String[] args) {
MessageClient client = new MessageClient();
boolean f = client.connect("127.0.0.1:8080", "Henry", "888888");
if (f) {
MsgReq req = new MsgReq();
req.setValueWithString("word", "Hi,I am Henry.");
MsgRes res = client.invoke(req);
if (res != null) {
String echo = res.getValueAsString("echo");
System.out.println(echo);
}
client.disconnect();
}
}
}
<!--EndFragment-->
<!--EndFragment-->
<!--EndFragment-->
<!--EndFragment-->
<!--EndFragment-->
<!--EndFragment-->