基于JAVA的ICQ系统的设计于实现

一.序言
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.系统模式及程序(具体程序参看源程序)
系统采用客户/服务器摸式(如图)

  1. 服务器程序: 

服务器与客户间通过套接口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.equals("login")) {//如果是登录

          try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//连接数据库

         Connection c=DriverManager.getConnection("jdbc:odbc:javaicq"," "," ");

         String sql="select nickname,password from icq where icqno=?";

           //准备从数据库选择呢称和密码

  PreparedStatement prepare=c.prepareCall(sql);//设定数据库查寻条件

          String icqno=in.readLine();

                int g=Integer.parseInt(icqno);//取得输入的jicq号码

                 System.out.println(icqno);

                 String passwd=in.readLine().trim();//取得输入的密码

                 System.out.println(passwd);

                 prepare.clearParameters();

                 prepare.setInt(1,g);//设定参数

                 ResultSet r=prepare.executeQuery();//执行数据库查寻

                 if(r.next()){//以下比较输入的号码于密码是否相同

                     String pass=r.getString("password").trim();

                     System.out.println(pass);

                     if(passwd.regionMatches(0,pass,0,pass.length()))

{ out.println("ok");

//如果相同就告诉客户ok

//并且更新数据库用户为在线

//以及注册用户的ip 地址

                      //*************register ipaddress

                      String setip="update icq set ip=? where icqno=?";

                      PreparedStatement prest=c.prepareCall(setip);

                      prest.clearParameters();

                      prest.setString(1,socket.getInetAddress().getHostAddress());

                      prest.setInt(2,g);

                      int set=prest.executeUpdate();

                      System.out.println(set);

                      //*************ipaddress

                      //set status online

                      String status="update icq set status=1 where icqno=?";

                      PreparedStatement prest2=c.prepareCall(status);

                       prest2.clearParameters();

                       prest2.setInt(1,g);

                       int set2=prest2.executeUpdate();

                      System.out.println(set2);

                     

  • 35
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

需要什么私信我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值