既然不能在ClientCommandHandler和ServerAuthenticator类中保存客户数据,我们使用ClientData类的handleCommand()或askAuthorisation()方法来存储所有的客户端信息。
示范一下这个特点有什么用。还是以EchoServer为例,当用户发送"Hello"时,我们给他一个问候。如果用户再发送"Hello",我们提醒他已经发了n次"Hello"。接下来定义ClientData类来存储用户名以及他向服务器发送"Hello"的次数。 1. 代码 1. 在EchoServer中创建一个EchoServerData类
2. 告诉QuickServer用这个EchoServerData来做为它的ClientData类。 修改前面创建的EchoServer.java,代码如下:
上面的代码中,我们将配置信息写入String对象来设置QuickServer。 3. 修改Authenticator类,也就是EchoServerAuthenticator类,让它在ClientData对象中存储用户名。下面是修改后的代码:
4. 修改ClientCommandHandler实现类EchoCommandHandler。如果用户发送"Hello",给他一个问候。如果他发送多次"Hello",告诉他已经发送了n次"Hello"。下面是修改后的代码:
5. 编译改好的程序,运行,使用SocketTest测试。登录后,发送"Hello",系统会给一个问候,再次发送"Hello",它将告诉你发送了多少次"Hello"。 4.2 创建ClientData池 现在我们知道ClientData可以正常工作了。但是对每一个连接QuickServer的客户端都要创建一个新的ClientData对象,可能会造成性能上的瓶颈,尤其对性能要求较高的服务器来说。 我们可以创建一个ClientData池对象,无论客户端什么时候进行连接,都使用同一个对象。首先实现下面的接口: org.quickserver.util.pool.PoolableObject 查找QuickServer API文档可以发现PoolableObject只有两个必须实现的方法: org.apache.commons.pool.PoolableObjectFactory属于通常的工厂方法。 isPoolable()判断对象是否可以成为池对象。 PoolableObjectFactory org.apache.commons.pool.PoolableObjectFactory接口包含了以下方法: o void activateObject(Object obj):重新初始化一个实例。 o void destroyObject(Object obj):销毁一个不再需要的实例。 o Object makeObject():创建一个实例。 o void passivateObject(Object obj):禁止初始化一个实例。 o boolean validateObject(Object obj):确定一个实例是否安全。 我们可以扩展一个基于无操作的实现来创建可"池"化的对象: org.apache.commons.pool.BasePoolableObjectFactory 这个类只有一个抽象方法makeObject()和一个validateObject()方法,它只返回true。 我们来创建一个EchoServerPoolableData类。
| |||||||
QuickServer开发指南(5)- 客户数据
最新推荐文章于 2024-03-30 09:51:27 发布