OMG,到底在寻找什么..................
(构造一个完美的J2EE系统所需要的完整知识体系)
posts - 198,  comments - 37,  trackbacks - 0
原贴地址: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 阅读(1898) 评论(0)  编辑  收藏 所属分类: Soket

只有注册用户登录后才能发表评论。


网站导航:
 

<2006年12月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

常用链接

留言簿(1)

随笔分类

随笔档案

IT风云人物

文档

朋友

相册

经典网站

搜索

  •  

最新评论

阅读排行榜

评论排行榜