大大毛 的笔记

  DDM's Note

哪怕没有办法一定有说法,
就算没有鸽子一定有乌鸦,
固执无罪 梦想有价,
让他们惊讶.

posts - 14, comments - 23, trackbacks - 0, articles - 58
   :: 首页 ::  :: 联系 ::  :: 管理

自己实现的一个ICQ程序(得意之作啊)

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


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


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问  
 

i am ddm