Skip to content
buptlsy edited this page Jun 1, 2015 · 1 revision

Welcome to the java-programming wiki! 一:java nio实现多客户端的聊天室 一:.程序设计的思路 本程序是用java nio实现的简单的聊天系统。主要实现的功能分别有: 功能1: 客户端通过Java NIO连接到服务端,支持多客户端的连接。主要用了java nio的特性来实现这个功能。 功能2:客户端初次连接时,服务端提示输入昵称,如果昵称已经有人使用,提示重新输入,如果昵称唯一,则登录成功,之后发送消息都需要按照规定格式带着昵称发送消息。实现:主要使用了hashset来进行判重的。每次登陆一个用户时,如果之前没有重复的话,会将其加入hashset中;如果重复了,则会让客户端重新输入一个。 功能3:客户端登录后,发送已经设置好的欢迎信息和在线人数给客户端,并且通知其他客户端该客户端上线。实现:统计在线人数的话,需要扫描一遍所有的SocketChannel来统计总人数。发送欢迎消息的话,则参考功能4的实现。 功能4:服务器收到已登录客户端输入内容,转发至其他登录客户端。主要是扫描一遍所有的连接,在对除了该客户端连接外的其他的所有连接发送消息。 功能5:当某一客户端输入"/quit"时,会通知其他客户端该客户端已下线。程序中实现的断开连接的过程是:当客户端发送"/quit"后,在客户端会将“已取消请求”标记置为true,而客户端的任务会不断的检查这个标记。当该标记为true时,则会将任务结束。在服务器端收到消息并且解析出消息为”/quit”时,会在服务器端关闭套接字通道。 功能6:当客户端60s内没有发送任何消息的话,则服务器主动断开连接。主要是利用了java的定时器机制。用数据结构HashMap来存储,Map<客户端ip地址+端口号, 时间>。每次建立连接是则会将本次连接存放到map中。当每次客户端向服务器端发送数据时,则更新这个时间。而定时器任务则是每个60s扫描所有的连接,看看是否时间超过了60s。如果超过了60s,则会断开连接。 功能7:增加了带缓存的查询功能,缓存过期时间设置为2小时。主要是利用了HashMap来实现了缓存。结构为Map<查询类型,Map<具体的查询内容,查询结果>>。查询类型用了enum来实现,查询结果的类结构中,包含有过期时间这一字段,用来设置缓存内容的过期时间(程序中设计的过期时间为2小时)。当客户端向服务端发送查询请求的时候,先在服务端的缓存中查看是不是有查询内容的缓存,如果有并且没有过期的话,则直接返回缓存中的数据;否则需要在服务端调用第三方接口来获得数据,同时创建或者更新缓存。

二:程序中可以改进的地方 1.在统计在线人数的时候,本程序的做法是扫描所有的socketChannel来统计的,时间复杂度为O(n)。但是当在线人数非常多的时候,程序的效率会比较低。比较好的方案是:在服务器端维护一个全局变量number来记录在线人数。当一个用户上线时,number++;当用户下线时,number--;这样在统计在线人数的时候,可以在O(1)的时间复杂度内完成。 2.程序中对于支持10万级以上的客户端登陆情况没有考虑。

三:如果系统支撑的用户数量扩大100倍,如何处理? 当用户的数量增大时,可以考虑将服务端应用部署在多个甚至上百台服务器上,并用nginx服务器作负载均衡。这样会使这些服务器上均衡的分担在线用户数。

四:如果需要实现查询功能的动态增减,给出解决办法说明,不需要写出代码;

Clone this wiki locally