分享
 
 
 

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

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

分析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.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);

//set online

}

//否者告诉客户失败

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(str.equals("new")){

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

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

String newsql="insert into icq(nickname,password,email,info,place,pic) values(?,?,?,?,?,?)";

//预备接受用户的呢称,密码,email,个人资料,籍贯,头像等信息

PreparedStatement prepare2=c2.prepareCall(newsql);

String nickname=in.readLine().trim();

String password=in.readLine().trim();

String email=in.readLine().trim();

String info=in.readLine().trim();

String place=in.readLine().trim();

int picindex=Integer.parseInt(in.readLine());

prepare2.clearParameters();

prepare2.setString(1,nickname);

prepare2.setString(2,password);

prepare2.setString(3,email);

prepare2.setString(4,info);

prepare2.setString(5,place);

prep

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有