Posted on 2006-03-09 02:07
大大毛 阅读(473)
评论(0) 编辑 收藏 所属分类:
JAVA
前言:
这是去年来广州找工作之前写的,预备在应聘时当砖头拿出来。结果没得逞,好象人家只要看看编程风格就行了。不过全部是自己写的(从头到脚),结构也是自己想着去设计的,里面有很多东西,经常都可以拿出来借鉴一下子.用处也算不小。
简介如下:
开发环境:Win2k+JDK1.4.2
开发工具:Eclipse3.0
数据环境:
access+软连接池,演示时容易沙
开发者:
个人,原本是3个人想着学点东西,结果没曾想那两个兄弟觉得麻烦了,一个写了不到200行的SOCKED通信,一个写了N小的聊天室.
功能:
能够实现用户注册,登录,查找(3种方式,跟当年的QQ学的),聊天以及好友的上/下线提示等...
使用注意:
一定要记得配数据源,ZIP包中有说明的。不然无法工作。
结构说明:
这个得要好好说一下,毕竟是心血呕作啊。看看Socket的工作方式,就是服务端用serversocket在指定端口侦听,客户端向此端口连接,一旦成功,则serversocket从阻塞状态中恢复,产生一个socket对象与之对应。结果产生的就是Socket的一对一(在QQ群上听见人说Socket可以一对多,不晓得咋整)。图示如下:
ICQ示意图
其中客户端与服务端都是一样的Socket对象,可以封成一个类,把输入侦听也封进去(它与其它的对象完全无关),输出留下一个接口,这个类我叫它"Linker",然后作为ICQ,每个客人当然是有ID和图标/性别等信息的,我把它放入"ClientInfo"类,这个类实际上就是一个JavaBean,这样与数据库打交道时就比较好用了。在这两个类的上一层我提供了一个"Client"再次封了一下,它的最大用途是用于与消息分发器打交道,让它持有一个消息分发器的引用,这个类并保留了Linker的输出接口便于消息处理器调用。为了实现Linker收到消息时通知Client,我使用了观察者模式,让Linker实现Observable接口,而Client继承至Observer.这样通讯的线路方面就搞定了。
在Client对象的管理上,为了便于分组(QQ不也提供好友之类的么)。我提供了一个ClientGroup类来放Client,提供两个实例(已登录/未登录)来分开放,感觉上好一些。由于消息处理上经常需要调用Client对象,把这个功能拿出来专门封在一个类中,我叫它"ClientMangager"来管理那群滑头的Client。
然后到重要的消息处理上了,做了一个"MessageProcessor"的接口,让消息分发器"ServerMessageProcessor"和针对具体情况的消息处理器都实现这个接口,由于ICQ的通讯是实时也是多对多的,只能采用队列+先进先出的方式,这样想来可以处理一些状况了。分发器中持有一个HashMap,Key放上消息号,Value放上处理器的引用。由控制器来关心如何去搭配好了。这样的考虑就是,如果后期有兴趣增加ICQ的功能,如传输文件/图片等,就比较简单了,加一个消息号,加一个消息处理器,在控制器中向消息分发器添加一个注册即可。感觉上这是个么事模式之类的,呵呵。
服务端这边还剩一个端口侦听和数据处理了,端口侦听用了一个"PortListener",我把它放在common包中,原来打算是客户端那边以后实现客户/客户交互的时候也能够用上。数据处理上用上学校里的例子,有例子好啊改改就成自己的了。数据存取上为图方便采取的是直接对象存取(C++学习时的大禁啊),不管它了,反正能用,不过遗留下了隐患,一旦改动了一下类,就读不出来了。
服务端这边最后再上一个"Server"做为控制器,让它持有PortListener、ServerMessageProcessor、ServerClientManger,还是老套路用观察者模式与PortListener挂上勾。服务端OK。
再到非常非常重要的消息上,消息是多种多样的,每一个消息对应一个功能,来一个接口好了"Message",该接口中还放上了消息号(final)这样编写的时候也就简单直观得多了。
到此,时间已经过去N久,开始客户端编程,客户端是要来上几个窗体的,麻烦啊。根据功能分成多个JPanel/JFrame了,如登录窗口,显示聊天的面板,输入+发送面板,好友显示的面板,还有查找好友。。。总之耐心快没了。最后还是栽在了那个好友面板上,那个JList是个痛,我用上了ListCellRender渲染器,这个渲染器说实话还是蛮成功的,但是整到JList中就不贼,在单类的Main中演示都是好的。但是在最后的成果上就时灵时不灵,经常都会出现JList白板一块的问题(完全随机啊)。后来思考了一下,怀疑是在构造函数中调用太多东西的缘故,所以下载的朋友最后多试几次我保证能OK,我咳。
东西说得蛮多了,至此为止,眼见为实。
拜托:
有研究的朋友能整好那个JList显示的问题,万望告之。。。。
如实告之:
Server这边是先写的,比较有耐心,Client那边是先来写的,耐心没了,要评论的朋友多看看Server,好多留个面子
下载:
MyICQ.zip