2008年(3500)
分类:
2008-05-04 19:27:03
2001 年 10 月
分析ICQ系统,并尝试用Java编写。
一.序言
ICQ是英文"I seek you "的简称,中文意思是我找你。ICQ最大的功能就是即时信息交流 ,只要记得对方的号码,上网时可以呼他,无论他在哪里,只要他上网打开ICQ,人们就
可以随时交流。ICQ源于以色列特拉维夫的Mirabils公司。该公司成立于1996年7月, 也就是在这个时候,互联网上最出名,下载使用人数最多的免费软件ICQ诞生了。可能是
其不断增加的用户和广阔的前景以及广泛的应用前景和巨大的市场潜力,Mirabils的ICQ最 终被美国在线AOL收购。由于ICQ的成功,推动了ICQ的本土化,就中文的ICQ而言,现在已经越来越多,比如著名的深圳腾迅公司推出的OICQ(现在由于版权问题,已改名为QQ2001),还有由TOM.COM推出的Tomq等,这些软件技术都很好,而且简单易用,成为
中国网民最喜欢的通信软件。
但是这些公司都只提供软件的客户端程序免费下载,而不提供其服务器程序,因此对于未与互联网连接的私有网络,这些软件就用不上了。当然网上也有免费的类似ICQ的服务器提供下载,但是好多都不提供源程序,即使有,其说明也很简单,我很想知道它是怎么回事,所以我就试着做了。
二.设计
1.为什么选择JAVA?
Java是Sun Microsystem公司的James Gosling开发的编程语言。它以C 为基础,但是却是一个全新的软件开发语言。Java是一个简单,面象对象,分布式,解释性,强壮,安全,与系统无关,可移植,高性能,多线程和动态的语言-------这是
Sun给Java的定义。
Sun公司的口号就是"网络就是计算机",Java能使所有东西从桌面计算平稳的转变为基于网络的计算,它是专门为此而建立的,并显然是为了完成这个任务而来的。使用Java,我们可以相对轻松的一天编写一个有条理的网络程序。今天,Java的网络功能正在飞跃发展,不断有新的特性增加到这个有价值的基础上,JavaSoft实验室正在不断努力使Java更加完善。
2.数据库设计
系统可以采用任何一种流行的,Java支持的数据库,本系统采用了Microsoft公司的SQL Server2000作为后台数据库。通过对现在流行的一些Icq的参考,建立数据库,名为javaicq,数据库共建立两个表,一个是用户的基本信息,包括呢称,Jicq号码等。一个是用户的好友表,包括用户自己的号码和好友的号码。
(1)用户的基本信息表(表名icq)
序号 | 字段名 | 含义 | 数据类型 | NULL |
1 | Icqno | 用户的号码 | Int | No |
2 | Nickname | 用户的呢称 | Char | No |
3 | Password | 用户的密码 | Char | No |
4 | Status | 用户在线否 | Bit | No |
5 | Ip | 用户的IP地址 | Char | Yes |
6 | Info | 用户的资料 | Varchar | Yes |
7 | Pic | 用户的头像号 | Int | Yes |
8 | Sex | 用户性别 | Char | Yes |
9 | 用户的email | Char | Yes | |
10 | Place | 用户的籍贯 | Char | yes |
(2)用户的好友表(表名friend)
序号 | 字段名 | 含义 | 数据类型 | NULL |
1 | Icqno | 用户的号码 | Int | No |
2 | Friend | 好友的号码 | Int | No |
3. 系统模式及程序(具体程序参看源程序)
系统采用客户/服务器摸式(如图)
服务器与客户间通过套接口Socket(TCP)连接。在java中使用套接口相当简单,Java API为处理套接口的通信提供了一个类java.net.Socket.,使得编写网络应用程序相对容易.服务器采用多线程以满足多用户的请求,通过JDBC与后台数据库连接,并通过创建一个ServerSocket对象来监听来自客户的连接请求,默认端口为8080,然后无限循环调用accept()方法接受客户程序的连接
服务器程序代码如下:(部分)
|
客户通过Socket(InetAddress,port)建立与服务器的连接。服务器与客户都通过构造BufferedReader,PrintWriter来建立输入输出流,然后双方通过该输入输出流来相互传递信息,一旦收到客户方的连接请求,服务器accept()方法返回一个新建的Socket对象。客户端然后向服务器发送消息,比如注册,登录,查找好友等,服务器收到来自客户的请求后,针对不同的消息处理请求, 虽然UDP不可靠但是对于icq可靠性并不太重要,而且UDP快速,所以客户间发送信息通过UDP。用户登录时通过类DatagramPacket和DatagramSocket创建UDP包括其本地接受端口以及发送端口,默认端口为5000和5001,通过取得的好友的IP地址来向好友发送消息(send(DatagramPacket)和接受消息(receive(DatagramPacket))。当用户通过UDP收到消息后,可以通过DatagramPacket的方法InetAddress getAddress()得到对方的ip地址,通过对好友列表比较以判断是谁并提示用户收到某某的消息,然后用户选择该用户查看消息,如果好友列表没有该人就显示收到陌生人的消息。用户可以按陌生人按钮查看消息。
******部分程序如下:
|
部分程序如下:(程序流程图与注册差不多,略)
|
三.程序界面
程序界面主要参考腾迅公司的QQ2000,在实现时采用的Java的Swing图形包。开发工具用的是Borland公司的Jbuilder4。
四.程序的使用
源程序参见 src.zip.
五.参考资料:
另外,该程序在端口上选取的是固定的一个端口,所以在同一机器只能运行一次,如果单机调试可以修改客户程序的udp端口(我的5000目录是个例子,将int udpPORT=5001,int sendPort=5000改为int udpPORT=5000,int sendPort=5001)
下载本文示例代码