文章详情页
基于JAVA的ICQ系统的设计于实现
浏览:3日期:2024-06-22 11:51:56
内容: 出自:www.ibm.com.cn 何刚 2002年10月09日 23:01 分析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 用户的email Char Yes 10 Place 用户的籍贯 Char yes 其中Icqno字段为自动增加。(其他还可以添加诸如电话号码等字段作为更多选择)(2)用户的好友表(表名friend) 序号 字段名 含义 数据类型 NULL 1 Icqno 用户的号码 Int No 2 Friend 好友的号码 Int No 3. 系统模式及程序(具体程序参看源程序) 系统采用客户/服务器摸式(如图)服务器程序: 服务器与客户间通过套接口Socket(TCP)连接。在java中使用套接口相当简单,Java API为处理套接口的通信提供了一个类java.net.Socket.,使得编写网络应用程序相对容易.服务器采用多线程以满足多用户的请求,通过JDBC与后台数据库连接,并通过创建一个ServerSocket对象来监听来自客户的连接请求,默认端口为8080,然后无限循环调用accept()方法接受客户程序的连接服务器程序代码如下:(部分) import java.io.*;import java.net.*;import java.sql.*;import java.util.Vector;class ServerThread extends Thread{//继承线程private Socket socket;//定义套接口private BufferedReader in;//定义输入流private PrintWriter out;//定义输出流int no;//定义申请的jicq号码public ServerThread(Socket s) throws IOException {//线程构造函数socket=s;//取得传递参数in=new BufferedReader(new InputStreamReader(socket.getInputStream()));//创建输入流out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);//创建输出流start();//启动线程}public void run(){//线程监听函数try{ while(true){String str=in.readLine();//取得输入字符串if(str.equals('end'))break;//如果是结束就关闭连接else if(str//否者告诉客户失败else out.println('false');r.close();c.close();}else{ out.println('false');System.out.println('false');r.close();c.close();}}catch (Exception e){e.printStackTrace();}socket.close();}//end login//登录结束//以下为处理客户的新建请求else if(strout.println(no);out.println('ok');c2.close();//完毕}catch (Exception e){e.printStackTrace();out.println('false');}socket.close();}//end new//新建用户结束//以下处理用户查找好友else if(str//while endout.println('over');////////GET ICQNOint d,x;boolean y;//以下返回用户的jicq号码,头像号,及是否在线ResultSet iset=st.executeQuery('select icqno,pic,status from icq');while(isetelse {out.println('0');}//System.out.println(d);}// end send jicqnoiset.close();/////////icqno endc3.close();result.close();}catch (Exception e){e.printStackTrace();System.out.println('false');}//socket.close();}//end find//查找好友结束//以下处理用户登录时读取其好友资料else if(str//read friend info//以下告诉客户其好友的呢称,号码,ip地址,状态,头像,个人资料等信息out.println(friendno.size());for(int i=0;i
标签:
Java
上一条:理解java的多形性下一条:Java繁体中文处理完全攻略(二)
相关文章:
排行榜
