QuickServer

QuickServer是个java开元框架,很方面很容易实现多线程、多客户端TCP服务应用。今天在QuickServer网站http://www.quickserver.org/下载文档DevelopersGuidev0.3.zip,此文档详细介绍QuickServer是如何应用的。现在把读后感受写下来,欢迎大家指正:

QuickServer基本构件有4个,分别是:

ClientCommandHandler[必选的]:处理跟客户端的交互(字符串方式)

ClientObjectHandler[可选的]:处理客户端的交互(对象方式)

Authenticator[可选的]:客户认证

ClientData[可选的]:承载客户端数据

QuickServer - snow - snow的博客

 如何写一个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是否实现可以根据用户需求,不是必须的。

原文地址:https://www.cnblogs.com/hzcya1995/p/13318595.html