QuickServer是个java开元框架,很方面很容易实现多线程、多客户端TCP服务应用。今天在QuickServer网站http://www.quickserver.org/下载文档DevelopersGuidev0.3.zip,此文档详细介绍QuickServer是如何应用的。现在把读后感受写下来,欢迎大家指正:
QuickServer基本构件有4个,分别是:
ClientCommandHandler[必选的]:处理跟客户端的交互(字符串方式)
ClientObjectHandler[可选的]:处理客户端的交互(对象方式)
Authenticator[可选的]:客户认证
ClientData[可选的]:承载客户端数据
如何写一个QuickServer服务呢?
1、首先写一个带有main函数的类,不妨定义为:EchoServer类型,其中main函数包含如下代码:
public static void main(String[] args) {
QuickServer myServer =new QuickServer();
String configFile = ".\src\mypackage\NewFile.xml";(xml配置文件)
Object config [] = new Object[]{configFile};
if(myServer.initService(config)){ (初始化SocketServer)
try{
myServer.startQSAdminServer();(启动监控SocketServer服务)
myServer.startServer(); (启动SocketServer服务)
}catch(AppException e ){//todo
} catch (Exception e) { //todo
}
}
2、生成一个类,实现接口rg.quickserver.net.server.ClientCommandHandler,此类不妨定义为:HelloWorldCommandHandler
public class HelloWorldCommandHandler implements ClientCommandHandler {
public void closingConnection(ClientHandler arg0) throws IOException {
}
public void gotConnected(ClientHandler arg0) throws SocketTimeoutException,
IOException {
}
public void handleCommand(ClientHandler arg0, String arg1)
throws SocketTimeoutException, IOException {
}
public void lostConnection(ClientHandler arg0) throws IOException {
}
}
上面的ClientHandler arg0是处理客户端类实例,String arg1是接受到客户端的消息。
3、生成一个类,继承类QuickAuthenticator,此类不妨定义为:EchoQuickServerAuthenticator
如果继承类org.quickserver.net.server.QuickAuthenticator,那么当客户端连接QuickServer时候,此类是认证这个客户端的。仅仅有一个此类实例来处理所有客户端的认证。(此实现推荐使用)
如果继承类org.quickserver.net.server.ServerAuthenticator,那么当客户端连接QuickServer时候,此类是认证这个客户端的。每个被连接客户端将有一个单独此类实例来处理客户端的认证。
public class EchoQuickServerAuthenticator extends QuickAuthenticator {
@Override
public boolean askAuthorisation(ClientHandler arg0) throws IOException,
AppException {
String username = askStringInput(arg0,"User Name:");
String password = askStringInput(arg0,"User Password:");
if(){
return true;
}
else {
return false;
}
}
}
注意:不要在此类中存储客户端信息,如果一定要存储客户端信息,请在ClientData类中存放。并且此类不是必须的,可以不实现。
4、生成一个类,实现接口org.quickserver.net.server.ClientData,不妨定义为:EchoServerData,此类可以存放一下跟客户端有关系的信息,此类有个缺陷:为每个被连接的客户端创建一个ClientData对象,可能是一个资源瓶颈。为了解决这个问题,可以实现接口org.apache.commons.pool.PoolableObjectFactory,并且同时继承EchoServerData类。
5、写个xml配置文件,不妨定义为:quickServerConfig.xml
比如:
<quickserver>
<name>EchoServer v1.0</name>
<port>4123</port>
<bind-address>127.0.0.1</bind-address>
<client-command-handler>
mypackage.HelloWorldCommandHandler
</client-command-handler>
<authenticator>
mypackage.EchoQuickServerAuthenticator
</authenticator>
<client-data>
mypackage.EchoServerPoolableData
</client-data>
<console-logging-level>INFO</console-logging-level>
<!-- some extra config, add just to show -->
<timeout>40000</timeout>
<timeout-msg>-Err timeout</timeout-msg>
<max-auth-try>5</max-auth-try>
<max-auth-try-msg>-Err max try</max-auth-try-msg>
<max-connect>1</max-connect>
<max-connect-msg>connect full</max-connect-msg>
<object-pool>
<max-active>-1</max-active>
<max-idle>10</max-idle>
</object-pool>
<!-- some extra config end,add just to show -->
<qsadmin-server>
<name>EchoQAServer v 1.0</name>
<port>4124</port>
<bind-address>127.0.0.1</bind-address>
<command-plugin>mypackage.QSAdminCommandPlugin</command-plugin>
</qsadmin-server>
</quickserver>
总结:步骤1、2是必须的,步骤5信息其实可以写死在步骤1的文件中,不过灵活性不是很好,建议步骤5也是必须写的,步骤3、4是否实现可以根据用户需求,不是必须的。