原贴地址:http://blog.csdn.net/clearwater21cn/category/99145.aspx
QuickServer开发指南(6)- 远程管理支持
我们的EchoServer可能需要修改几个服务器配置参数,如超时消息、最多验证数、最大验证时间。QuickServer支持这些功能而无须改变代码。
1. 使用QSAdminServer 当我们需要一个管理服务器来控制我们的服务器时,我们不需要修改代码甚至关闭正在运行的服务器。这项服务的实现类是:
org.quickserver.net.qsadmin.QSAdminServer
要使用它的功能我们要调用QuickServer的startQSAdminServer()方法。QSAdminServer运行的默认端口是9876,我们可以使用下面两个方法之一修改它:
setQSAdminServerPort(4124);
getQSAdminServer().getServer().setPort(4124);
下面是能够在EchoServer 的4124端口运行QSAdminServer 的代码:
01 package echoserver; 02 03 import org.quickserver.net.*; 04 import org.quickserver.net.server.*; 05 06 import java.io.*; 07 08 public class EchoServer { 09 public static void main(String s[]) { 10 11 String cmd = "echoserver.EchoCommandHandler"; 12 String auth = "echoserver.EchoServerQuickAuthenticator"; 13 String data = "echoserver.EchoServerPoolableData"; //Poolable 14 15 QuickServer myServer = new QuickServer(cmd); 16 myServer.setAuthenticator(auth); 17 myServer.setClientData(data); 18 19 myServer setPort(4123); 20 myServer.setName("Echo Server v 1.0");
21 22 //config QSAdminServer 23 myServer.setQSAdminServerPort(4124); 24 myServer.getQSAdminServer().getServer().setName("EchoAdmin v 1.0"); 25 try { 26 myServer.startQSAdminServer(); 27 myServer.startServer(); 28 } catch(AppException e){ 29 System.out.println("Error in server : "+e); 30 } 31 } 32 } 33 |
这样,我们定义了我们的QSAdminServer运行在4124端口。但是它怎样进行验证呢?如果没有一个外在的验证器,QSAdminServer将使用org.quickserver.net.qsadmin.Authenticator做为它的验证器。查阅API文档我们可以发现它非常简单,用户名和密码都被硬编码为:
用户名 : Admin
密码 : QsAdm1n
现在让我们编译新的程序并运行之,控制台将会输出信息以说明服务器运行于4124端口。
在QuickServer安装目录下的bin目录下运行QsAdminGUI.bat,QsAdmin的界面如下所示
现在可以连接到管理服务器了。点击右上角的"Login"按钮,将会弹出一个登录对话框如下图,输入IP地址和服务器运行端口:127.0.0.1、4124,因为我们使用默认的用户名密码,直接点击"Login"登录。
登录后界面将会显示欢迎及登录成功信息。现在可以选择发送命令的目标服务器(Target)及左边一排命令按钮所示的操作。
Target是基于发送命令的服务器,因为我们目前有两个服务器EchoServer和EchoAdmin。
界面右下边有一个可以直接向服务器发送消息的文本框,命令可以参考QsAdmin command handler:
org.quickserver.net.qsadmin.CommandHandler API文档
若想要改变服务器的配置,可以点选"Get/Set"书签,只要选择"Target",点击"Reload Properties For The Target"以重新加载目标服务器的配置。修改好参数,然后点击"Save"就可以了。部分参数的生效需要重启服务器,不过这样不会断开与客户端的连接。
2. 添加自己的命令 前面讲过如果我们想改变一些服务器的属性,我们无须修改已有的代码或重启服务器,我们可以添加自己的命令来管理服务器。
让我们用一个例子来演示这个功能。当用户发送"What's interest"(利息是多少)时,我们将要显示当前的利率。这个数字存贮在一个对象中,如果需要的话,无须重启服务器就可以改变它。我们说它是可变的并且当服务器运行时我们需要改变它。
我们来实现command handler以显示利率。首先要改变EchoServer和command handler。下面是代码:
01 package echoserver; 02 03 import org.quickserver.net.*; 04 import org.quickserver.net.server.*; 05 06 import java.io.*; 07 08 public class EchoServer { 09 public static void main(String s[]) { 10 11 String cmd = "echoserver.EchoCommandHandler"; 12 String auth = "echoserver.EchoServerQuickAuthenticator"; 13 String data = "echoserver.EchoServerPoolableData"; //Poolable 14 15 QuickServer myServer = new QuickServer(cmd); 16 myServer.setAuthenticator(auth); 17 myServer.setClientData(data); 18 19 myServer.setPort(4123); 20 myServer.setName("Echo Server v 1.0"); 21 22 //store data needed to be changed by QSAdminServer 23 Object[] store = new Object[]{"12.00"}; 24 myServer setStoreObjects(store); 25 26 //config QSAdminServer 27 myServer.setQSAdminServerPort(4124); 28 myServer.getQSAdminServer().getServer().setName("EchoAdmin v 1.0"); 29 try { 30 myServer.startQSAdminServer(); 31 myServer.startServer(); 32 } catch(AppException e){ 33 System.out.println("Error in server : "+e); 34 }
35 } 36 } 37 |
01 // EchoCommandHandler.java 02 package echoserver; 03 04 import java.net.*; 05 import java.io.*; 06 import org.quickserver.net.server.ClientCommandHandler; 07 import org.quickserver.net.server.ClientHandler; 08 09 public class EchoCommandHandler implements ClientCommandHandler { 10 11 public void gotConnected(ClientHandler handler) 12 throws SocketTimeoutException, IOException { 13 handler.sendClientMsg("+++++++++++++++++++++++++++++++"); 14 handler.sendClientMsg("| Welcome to EchoServer v 1.0 |"); 15 handler.sendClientMsg("| Note: Password = Username |"); 16 handler.sendClientMsg("| Send 'Quit' to exit |"); 17 handler.sendClientMsg("+++++++++++++++++++++++++++++++"); 18 } 19 public void lostConnection(ClientHandler handler) 20 throws IOException { 21 handler.sendSystemMsg("Connection lost : " + 22 handler.getSocket().getInetAddress()); 23 } 24 public void closingConnection(ClientHandler handler) 25 throws IOException { 26 handler.sendSystemMsg("Closing connection : " + 27 handler.getSocket().getInetAddress()); 28 } 29 30 public void handleCommand(ClientHandler handler, String command) 31 throws SocketTimeoutException, IOException { 32 if(command.equals("Quit")) { 33 handler.sendClientMsg("Bye ;-)"); 34 handler.closeConnection(); 35 return; 36 } 37 if(command.equals("What's interest?")) { 38 handler.sendClientMsg("Interest is : "+ 39 (String)handler.getServer().getStoreObjects()[0]+ 40 "%");
41 } else if(command.equalsIgnoreCase("hello")) { 42 EchoServerData data = (EchoServerData) handler.getClientData(); 43 data.setHelloCount(data.getHelloCount()+1); 44 if(data.getHelloCount()==1) { 45 handler.sendClientMsg("Hello "+data.getUsername()); 46 } else { 47 handler.sendClientMsg("You told Hello "+data.getHelloCount()+ 48 " times. "); 49 } 50 } else { 51 handler.sendClientMsg("Echo : "+command); 52 } 53 } 54 } |
接下来为QSAdminServer 添加Command插件
01 package echoserver; 02 03 04 import java.io.*; 05 import java.net.SocketTimeoutException; 06 import org.quickserver.net.server.*; 07 import org.quickserver.net.qsadmin.*; 08 09 public class QSAdminCommandPlugin implements CommandPlugin { 10 /** 11 * Echoserver commands 12 * ---------------------------------- 13 * set interest value 14 * get interest 15 */ 16 public boolean handleCommand(ClientHandler handler, String command) 17 throws SocketTimeoutException, IOException { 18 19 QuickServer echoserver = (QuickServer) 20 handler.getServer().getStoreObjects()[0]; 21 Object obj[] = echoserver.getStoreObjects(); 22 23 if(command.toLowerCase().startsWith("set interest ")) { 24 String temp = ""; 25 temp = command.substring("set interest ".length()); 26 obj[0] = temp; 27 echoserver.setStoreObjects(obj); 28 handler.sendClientMsg("+OK interest changed"); 29 return true;
30 } else if(command.toLowerCase().equals("get interest")) { 31 handler.sendClientMsg("+OK " + (String)obj[0]); 32 return true; 33 } 34 //ask QSAdminServer to process the command 35 return false; 36 } 37 } |
在上面的代码中,我们使用下面的代码调用了EchoServer的QSAdminServer中的存贮对象。(参考QuickServer API 文档中的QSAdminServer和CommandPlugin部分)。
QuickServer echoserver = (QuickServer)handler.getServer().getStoreObjects()[0];
如果进程获得了一个命令,返回true,否则返回false,并指明QSAdminServer的默认命令处理器将被用来处理命令。同样的技术将被使用于覆写QSAdminServer命令处理器的默认命令。
让我们告诉QuickServer这个类是QSAdminServer的Command插件。修改后的EchoServer.java代码如下:
01 package echoserver; 02 03 import org.quickserver.net.*; 04 import org.quickserver.net.server.*; 05 06 import java.io.*; 07 08 public class EchoServer { 09 public static void main(String s[]) { 10 11 String cmd = "echoserver.EchoCommandHandler"; 12 String auth = "echoserver.EchoServerQuickAuthenticator"; 13 String data = "echoserver.EchoServerPoolableData"; //Poolable 14 15 QuickServer myServer = new QuickServer(cmd); 16 myServer.setAuthenticator(auth); 17 myServer.setClientData(data); 18 19 myServer.setPort(4123); 20 myServer.setName("Echo Server v 1.0"); 21 22 //store data needed to be changed by QSAdminServer 23 Object[] store = new Object[]{"12.00"}; 24 myServer.setStoreObjects(store); 25 26 //config QSAdminServer 27 myServer.setQSAdminServerPort(4124); 28 myServer.getQSAdminServer().getServer().setName("EchoAdmin v 1.0");
29 try { 30 //add command plugin 31 myServer.getQSAdminServer().setCommandPlugin( 32 "echoserver.QSAdminCommandPlugin"); 33 myServer startQSAdminServer(); 34 myServer.startServer(); 35 } catch(AppException e){ 36 System.out.println("Error in server : "+e); 37 } catch(Exception e){ 38 System.out.println("Error : "+e); 39 } 40 } 41 } |
编译代码,并运行。现在打开客户端如SocketTest,发送命令"What's interest?",将显示"Interest is : 12.00%"。
运行QSAdminGUI,在发送消息框中键入以下命令,发送:
get interest
系统输出"+OK 12.00"
现在把这个参数修改一下,发送下面的命令
set interest 15.00
系统输出"+OK interest changed"
再次在客户端发送命令"What's interest?",客户端显示"Interest is : 15.00%"。
QuickServer开发指南(7)- 使用和定制日志对任何一个项目来说,日志都是一个重要的工具。日志帮助我们去理解我们的项目内部发生了什么,它也会提供审核和调试信息。想要知道更多有关日志的资料可查阅Sun公司的网站
http://java.sun.com/j2se/1.4.0/docs/guide/util/logging/overview.html QuickServer目前只支持Java Logging API (java.util.logging)。1.4版的Java已加入logging。如果你还在使用旧的版本,你可以安装Lumberjack库提供的可选的实现(
http://javalogging.sourceforge.net/)。
让我们给我们的EchoServer做一个日志器。QuickServer默认已可以使用日志器,但是除了ConsoleHandler和设置INFO的级别之外它什么也没有处理。因而无论何时我们在EchoServer关闭和客户端的连接,我们都会在控制台看见一些相似的信息
Feb 16, 2000 10:11:25 PM ClientHandler sendSystemMsg
INFO: Closing connection : /127.0.0.1
上面的信息指明IP为127.0.0.1的客户端关闭了连接。这条消息的显示使用了ClientHalder类的sendSystemMsg()方法.
让我们看看我们怎样在我们的项目中控制日志。使用java logging必须先在类中导入java.util.logging包。
从上面的日志,我们发现某些客户端关闭了连接或掉线,但是它是怎样显示的,我们并没有写任何有关日志的命令。它会显示是因为QuickServer使用了内部的日志器ClientHandler类的sendSystemMsg()方法。
查看QuickServer文档可以找到sendSystemMsg(),如果没有指定级别,它默认使用INFO。你可以在ClientCommandHandler或Authenticator或任何类中使用sendSystemMsg()来记录一个事件。
1. 简单的日志 现在我们来记录每一个连接EchoServer的客户端IP地址。编辑EchoCommandHandler.java文件。在gotConnected(ClientHandler handler)后添加
handler.sendSystemMsg("New Client : " +
handler.getSocket().getInetAddress().getHostAddress(),
Level.INFO);
还要导入包import java.util.logging.*;
编译并运行,连接到EchoServer,你将看到当客户端连接时控制台会显示你的地址。
让QuickServer将日志记录到文件中(XML格式)。下面是修改的文件:
01 package echoserver; 02 03 import org.quickserver.net.*; 04 import org.quickserver.net.server.*; 05 06 import java.io.*; 07 import java.util.logging.*; 08 09 public class EchoServer { 10 public static void main(String s[]) { 11 12 String cmd = "echoserver.EchoCommandHandler"; 13 String auth = "echoserver.EchoServerQuickAuthenticator"; 14 String data = "echoserver.EchoServerPoolableData"; //Poolable 15 16 QuickServer myServer = new QuickServer(); 17 18 //setup logger to log to file 19 Logger logger = null; 20 FileHandler xmlLog = null; 21 File log = new File("./log/"); 22 if(!log.canRead()) 23 log.mkdir(); 24 try { 25 logger = Logger.getLogger(""); //get root logger 26 logger.setLevel(Level.INFO); 27 xmlLog = new FileHandler("log/EchoServer.xml");
28 logger.addHandler(xmlLog); 29 } catch(IOException e){ 30 System.err.println("Could not create xmlLog FileHandler : "+e); 31 } 32 //set logging level to fine 33 myServer setConsoleLoggingLevel(Level INFO); 34 35 36 myServer.setClientCommandHandler(cmd); 37 myServer.setAuthenticator(auth); 38 myServer.setClientData(data); 39 40 myServer.setPort(4123); 41 myServer.setName("Echo Server v 1.0"); 42 43 //store data needed to be changed by QSAdminServer 44 Object[] store = new Object[]{"12.00"}; 45 myServer.setStoreObjects(store); 46 47 //config QSAdminServer 48 myServer.setQSAdminServerPort(4124); 49 myServer.getQSAdminServer().getServer().setName("EchoAdmin v 1.0"); 50 try { 51 //add command plugin 52 myServer.getQSAdminServer().setCommandPlugin( 53 "echoserver.QSAdminCommandPlugin"); 54 myServer.startQSAdminServer(); 55 myServer.startServer(); 56 } catch(AppException e){ 57 System.out.println("Error in server : "+e); 58 } catch(Exception e){ 59 System.out.println("Error : "+e); 60 } 61 } 62 } |
在上面的代码中,我们首先检查是否存在一个日志文件夹(21、22行),如果没有先创建它。
在25行,我们尝试获得一个日志器,28行,添加一个新的FileHandler,这里我们没有指定格式因为默认的格式就是XML的。
在33行,我们设置日志的控制级别为INFO。
接下来修改EchoCommandHandler.java
01 // EchoCommandHandler.java 02 package echoserver;
03 04 import java.net.*; 05 import java.io.*; 06 import org.quickserver.net.server.ClientCommandHandler; 07 import org.quickserver.net.server.ClientHandler; 08 import java.util.logging.*; 09 10 public class EchoCommandHandler implements ClientCommandHandler { 11 12 public void gotConnected(ClientHandler handler) 13 throws SocketTimeoutException, IOException { 14 handler.sendSystemMsg("New Client : "+ 15 handler.getSocket().getInetAddress().getHostAddress(), 16 Level.INFO); 17 handler.sendClientMsg("+++++++++++++++++++++++++++++++"); 18 handler.sendClientMsg("| Welcome to EchoServer v 1.0 |"); 19 handler.sendClientMsg("| Note: Password = Username |"); 20 handler.sendClientMsg("| Send 'Quit' to exit |"); 21 handler.sendClientMsg("+++++++++++++++++++++++++++++++"); 22 } 23 public void lostConnection(ClientHandler handler) 24 throws IOException { 25 handler.sendSystemMsg("Connection lost : " + 26 handler.getSocket().getInetAddress()); 27 } 28 public void closingConnection(ClientHandler handler) 29 throws IOException { 30 handler.sendSystemMsg("Closing connection : " + 31 handler.getSocket().getInetAddress()); 32 } 33 34 public void handleCommand(ClientHandler handler, String command) 35 throws SocketTimeoutException, IOException { 36 if(command.equals("Quit")) { 37 handler.sendClientMsg("Bye ;-)"); 38 handler.closeConnection(); 39 return; 40 } 41 if(command.equals("What's interest?")) { 42 handler.sendClientMsg("Interest is : "+ 43 (String)handler.getServer().getStoreObjects()[0]+ 44 "%"); 45 } else if(command.equalsIgnoreCase("hello")) { 46 EchoServerData data = (EchoServerData) handler.getClientData(); 47 data.setHelloCount(data.getHelloCount()+1); 48 if(data.getHelloCount()==1) { 49 handler.sendClientMsg("Hello "+data.getUsername()); 50 } else { 51 handler.sendClientMsg("You told Hello "+data.getHelloCount()+ 52 " times. "); 53 } 54 } else { 55 handler.sendClientMsg("Echo : "+command); 56 } 57 } 58 } |
编译并运行程序,现在尝试连接,你将看到它会同时在控制台和xml文件记录你的IP地址。
让我们使用QSAdminGUI设置日志级别为FINEST,观察日志内容的变化。日志记录增加了。另外一个改变日志级别的方法是修改代码,可以使用logger.setLevel()或者QuickServer的方法setLoggingLevel()来设置所有句柄的日志级别。
2. 日志的高级应用 当我们设置日志级别为FINEST时,会记录很多信息。一个可能的需要是分离QuickServer和应用的日志。下面的代码允许你这么做。
01 package echoserver; 02 03 import org.quickserver.net.*; 04 import org.quickserver.net.server.*; 05 06 import java.io.*; 07 import java.util.logging.*; 08 09 public class EchoServer { 10 public static void main(String s[]) { 11 12 String cmd = "echoserver.EchoCommandHandler"; 13 String auth = "echoserver.EchoServerQuickAuthenticator"; 14 String data = "echoserver.EchoServerPoolableData"; //Poolable 15 16 QuickServer myServer = new QuickServer(); 17 18 //setup logger to log to file 19 Logger logger = null; 20 FileHandler xmlLog = null; 21 FileHandler txtLog = null;
22 File log = new File("./log/"); 23 if(!log.canRead()) 24 log.mkdir(); 25 try { 26 logger = Logger.getLogger("org.quickserver.net"); //get QS logger 27 logger.setLevel(Level.FINEST); 28 xmlLog = new FileHandler("log/EchoServer.xml"); 29 logger.addHandler(xmlLog); 30 31 logger = Logger.getLogger("echoserver"); //get App logger 32 logger.setLevel(Level.FINEST); 33 txtLog = new FileHandler("log/EchoServer.txt"); 34 txtLog.setFormatter(new SimpleFormatter()); 35 logger.addHandler(txtLog); 36 myServer.setAppLogger(logger); //img : Sets logger to be used for app. 37 } catch(IOException e){ 38 System.err.println("Could not create xmlLog FileHandler : "+e); 39 } 40 //set logging level to fine 41 myServer.setConsoleLoggingLevel(Level.INFO); 42 43 44 myServer.setClientCommandHandler(cmd); 45 myServer.setAuthenticator(auth); 46 myServer.setClientData(data); 47 48 myServer.setPort(4123); 49 myServer.setName("Echo Server v 1.0"); 50 51 //store data needed to be changed by QSAdminServer 52 Object[] store = new Object[]{"12.00"}; 53 myServer.setStoreObjects(store); 54 55 //config QSAdminServer 56 myServer.setQSAdminServerPort(4124); 57 myServer.getQSAdminServer().getServer().setName("EchoAdmin v 1.0"); 58 try { 59 //add command plugin 60 myServer.getQSAdminServer().setCommandPlugin( 61 "echoserver.QSAdminCommandPlugin"); 62 myServer.startQSAdminServer(); 63 myServer.startServer(); 64 } catch(AppException e){ 65 System.out.println("Error in server : "+e); 66 } catch(Exception e){ 67 System.out.println("Error : "+e); 68 } 69 } 70 } |
代码中的注释说明的很清楚了。编译并运行,连接后你将看见QuickServer内部的日志记录到了xml文件,应用级别的日志记录到了我们想要的txt文件。
注意: 要尽量减少控制台中的日志数量,使用文件记录详细的日志,并降低日志的级别。这样可以改善应用的性能。避免使用System.out.println(),用logging代替。ClientHandler中的sendSystemMsg()方法在记录日志方面很有用。
QuickServer开发指南(8)- XML配置
在前面的章节里我们扩展了EchoServer。我们已经在类中配置了QuickServer,在某些情况下这是可接受的。但是很多应用更希望用户能够在应用启动后动态配置应用。给QuickServer添加这方面功能,你可以告诉服务器读取XML文件并实例化它。
要配置QuickServer首先要写配置文件,然后告诉QuickServer加载这个配置。下面是一个非常简单的配置文件
<quickserver>
<name>EchoServer v 1.0</name>
<client-command-handler>
echoserver.EchoCommandHandler
</client-command-handler>
</quickserver>
现在有两种方式启动服务器 - 使用QuickServer启动参数--load
在这里你要做的是在启动QuickServer时使用"-load"指定xml配置文件的路径。例如
java -jar QuickServer.jar -load myxmlconfig.xml
或
java org.quickserver.net.server.QuickServer -load myxmlconfig.xml
或
quickserver.bat -load myxmlconfig.xml
- 使用QuickServer的initService()方法
有时你可能需要在启动你的应用时使用自己的jar文件或类文件,或者你可能想要在启动前添加一些代码,那么这个选择是最合适的。下面的代码通过xml配置文件初始化了QuickServer。
QuickServer myServer = new QuickServer();
//pick the xml file form config folder
String confFile = "conf" + File.separator + "MyServer.xml";
Object config[] = new Object[] {confFile};
if(myServer.initService(config) != true) {
System.err.println("Could't init server !!");
}
现在我们来给我们的EchoServer写配置文件。下面是XML文件
01 <quickserver> 02 <name>EchoServer v 1.0</name> 03 <port>4123</port> 04 <bind-address>127.0.0.1</bind-address> 05 06 <client-command-handler> 07 echoserver.EchoCommandHandler 08 </client-command-handler> 09 <authenticator> 10 echoserver.EchoServerQuickAuthenticator 11 </authenticator> 12 <client-data> 13 echoserver.EchoServerPoolableData 14 </client-data> 15 16 <console-logging-level>INFO</console-logging-level> 17 18 <!-- some extra config. added just to show --> 19 <timeout>4</timeout> 20 <timeout-msg>-ERR Timeout</timeout-msg> 21 <max-auth-try>5</max-auth-try> 22 <max-auth-try-msg>-ERR Max Auth Try Reached</max-auth-try-msg> 23 <max-connection>-1</max-connection> 24 <max-connection-msg> 25 Server Busy\nMax Connection Reached 26 </max-connection-msg> 27 <object-pool> 28 <max-active>-1</max-active> 29 <max-idle>15</max-idle> 30 </object-pool> 31 <!-- some extra config. added just to show --> 32 33 <qsadmin-server> 34 <name>EchoAdmin v 1.0</name> 35 <port>4124</port> 36 <bind-address>127.0.0.1</bind-address> 37 <command-plugin> 38 echoserver.QSAdminCommandPlugin 39 </command-plugin> 40 </qsadmin-server> 41 42 </quickserver> |
下面是修改过的EchoServer.java文件,它现在可以从xml文件加载配置
01 package echoserver; 02 03 import org.quickserver.net.*; 04 import org.quickserver.net.server.*; 05 06 import java.io.*; 07 import java.util.logging.*; 08 09 public class EchoServer { 10 public static void main(String s[]) { 11 12 QuickServer myServer = new QuickServer(); 13 14 //setup logger to log to file 15 Logger logger = null; 16 FileHandler xmlLog = null; 17 FileHandler txtLog = null; 18 File log = new File("./log/"); 19 if(!log.canRead()) 20 log.mkdir(); 21 try { 22 logger = Logger.getLogger("org.quickserver.net"); //get qs logger 23 logger.setLevel(Level.FINEST); 24 xmlLog = new FileHandler("log/EchoServer.xml"); 25 logger.addHandler(xmlLog); 26 27 logger = Logger.getLogger("echoserver"); //get app logger 28 logger.setLevel(Level.FINEST); 29 txtLog = new FileHandler("log/EchoServer.txt"); 30 txtLog.setFormatter(new SimpleFormatter()); 31 logger.addHandler(txtLog); 32 //img : Sets logger to be used for app. 33 myServer.setAppLogger(logger); 34 } catch(IOException e){ 35 System.err.println("Could not create xmlLog FileHandler : "+e); 36 } 37 38 //store data needed to be changed by QSAdminServer 39 Object[] store = new Object[]{"12.00"}; 40 myServer.setStoreObjects(store); 41 42 //load QuickServer from xml
43 String confFile = "config"+File.separator+"EchoServer.xml"; 44 Object config[] = new Object[] {confFile}; 45 if(myServer.initService(config) == true) { 46 try { 47 myServer.startQSAdminServer(); 48 myServer.startServer(); 49 } catch(AppException e){ 50 System.out.println("Error in server : "+e); 51 } catch(Exception e){ 52 System.out.println("Error : "+e); 53 } 54 } 55 } 56 } 57 |
想要知道更多的XML配置请参考QuickServer Java文档(主页有一个xml样本)以及QuickServer提供的例子。
QuickServer开发指南(9)- 数据模式和数据类型
直到现在我们的通信还是仅仅在使用以<CR><LF>结尾的字符串。当然,在Internet标准协议里它是最常用的。但有时我们可能需要接收字节流或Java对象。
下面是数据模式和数据类型,使用它你可以告诉ClientHandler使用哪一种通信模式。
数据模式用于定义QuickServer和客户Socket之间的数据交换格式。下面是目前支持的三种模式:
- DataMode.STRING - 这是默认的交换模式,在这种模式下你可以接收字符串数据(以<CR><LF>结尾)
- DataMode.OBJECT - 在这种模式里你可以接收可序列化的Java对象。这种模式仅仅使用在客户端可以写java的情况下。
- DataMode.BYTE - 在这种模式下你可以接收客户端发送的所有字节,包括<CR>或<LF>或任何其它控制字符。这种模式在处理基于客户机或无标准协议如xml或你自己定义的协议的硬件时非常有用。
数据类型用户定义QuickServer和客户Socket之间的数据交换类型。目前有两种格式:
- DataType.IN - 指定数据为输入QuickServer的数据。
- DataType.OUT - 指定数据为从QuickServer输出的数据。
任何数据类型的数据模式都可以使用ClientHandler的setDataMode()方法设置,格式如下
setDataMode(DataMode dataMode, DataType dataType)
注意:
当模式为DataMode.OBJECT类型为DataType.IN,调用将会阻塞,直到客户端的ObjectOutputStream被写和头被刷新。
posted on 2006-12-04 19:49
OMG 阅读(1897)
评论(0) 编辑 收藏 所属分类:
Soket