QuickServer开发手册整理 联系客服

发布时间 : 星期六 文章QuickServer开发手册整理更新完毕开始阅读879fb9befd0a79563c1e7264

出一个org.quickserver.net.AppException异常,代码如下:

String username = askStringInput(clientHandler, \ if (username != null &&

username.equalsIgnoreCase(\ sendString(clientHandler, \ throw new AppException(\}

或者参考ClientHandler,关闭连接,代码如下:

String username = askStringInput(clientHandler, \ if (username != null &&

username.equalsIgnoreCase(\ sendString(clientHandler, \ clientHandler.closeConnection(); return false; }

ClientHandler对象能够提供很多客户端连接的有用信息,如IP地址。更多信息请参考API文档。

注意:

o 不要在验证器类中存贮任何客户端相关信息,如果需要,必须存放在ClientData类中--下一章将讲解该部分内容。

o 必须确认askAuthorisation()方法是线程安全的。

QuickServer开发手册(5)- 客户数据

既然不能在ClientCommandHandler和ServerAuthenticator类中保存客户数据,我们使用ClientData类的handleCommand()或askAuthorisation()方法来存储所有的客户端信息。

示范一下这个特点有什么用。还是以EchoServer为例,当用户发送\时,我们给他一个问候。如果用户再发送\,我们提醒他已经发了n次\。接下来定义ClientData类来存储用户名以及他向服务器发送\的次数。

1. 代码

1. 在EchoServer中创建一个EchoServerData类 01 //---- EchoServerData.java ---- 02 package echoserver; 03 04 import org.quickserver.net.server.*; 05 import java.io.*; 06 07 public class EchoServerData implements ClientData { 08 private int helloCount; 09 private String username; 10 11 public void setHelloCount(int count) { 12 helloCount = count; 13 } 14 public int getHelloCount() { 15 return helloCount; 16 } 17 18 public void setUsername(String username) { 19 this.username = username; 20 } 21 public String getUsername() { 22 return username; 23 } 24 } 25 //--- end of code ---

2. 告诉QuickServer用这个EchoServerData来做为它的ClientData类。 修改前面创建的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 = \; 12 String auth = \; 13 String data = \; 14 15 QuickServer myServer = new QuickServer(cmd); 16 myServer.setAuthenticator(auth); 17 myServer.setClientData(data); 18 19 myServer.setPort(4123); 20 myServer.setName(\); 21 try { 22 myServer.startServer(); 23 } catch(AppException e){ 24 System.out.println(\+e); 25 } 26 } 27 }

上面的代码中,我们将配置信息写入String对象来设置QuickServer。

3. 修改Authenticator类,也就是EchoServerAuthenticator类,让它在ClientData对象中存储用户名。下面是修改后的代码: 01 package echoserver; 02 03 import org.quickserver.net.server.*; 04 import java.io.*; 05 06 public class EchoServerQuickAuthenticator extends QuickAuthenticator { 07 08 public boolean askAuthorisation(ClientHandler clientHandler) 09 throws IOException { 10 String username = askStringInput(clientHandler, \Name :\); 11 if(username!=null && username.equalsIgnoreCase(\)) { 12 sendString(clientHandler, \); 13 //close the connection 14 clientHandler.closeConnection(); 15 return false; 16 } 17 18 String password = askStringInput(clientHandler, \:\); 19 20 if(username==null || password ==null) 21 return false; 22 23 if(username.equals(password)) { 24 sendString(clientHandler, \); 25 //store the username in ClientData 26 EchoServerData data = (EchoServerData)clientHandler.getClientData(); 27 data.setUsername(username); 28 return true; 29 } else { 30 sendString(clientHandler, \); 31 return false; 32 } 33 } 34 } 4. 修改ClientCommandHandler实现类EchoCommandHandler。如果用户发送

\,给他一个问候。如果他发送多次\,告诉他已经发送了n次\。下面是修改后的代码: 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(\); 15 handler.sendClientMsg(\); 16 handler.sendClientMsg(\); 17 handler.sendClientMsg(\); 18 } 19 public void lostConnection(ClientHandler handler) 20 throws IOException { 21 handler.sendSystemMsg(\+ 22 handler.getSocket().getInetAddress()); 23 } 24 public void closingConnection(ClientHandler handler) 25 throws IOException { 26 handler.sendSystemMsg(\+ 27 handler.getSocket().getInetAddress()); 28 } 29 30 public void handleCommand(ClientHandler handler, String command) 31 throws SocketTimeoutException, IOException { 32 if(command.equals(\)) { 33 handler.sendClientMsg(\); 34 handler.closeConnection(); 35 } if(command.equalsIgnoreCase(\)) { 36 EchoServerData data = (EchoServerData) handler.getClientData(); 37 data.setHelloCount(data.getHelloCount()+1); 38 if(data.getHelloCount()==1) { 39 handler.sendClientMsg(\+data.getUsername());