用java制作icq

时间:2020-10-18 14:09:33 理工毕业论文 我要投稿

用java制作icq

分析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)序号字段名含义数据类型null1icqno用户的号码intno2nickname用户的呢称charno3password用户的密码charno4status用户在线否bitno5ip用户的ip地址charyes6info用户的资料varcharyes7pic用户的头像号intyes8***用户性别charyes9email用户的emailcharyes10place用户的籍贯charyes其中icqno字段为自动增加。(其他还可以添加诸如电话号码等字段作为更多选择)

(2)用户的好友表(表名friend)序号字段名含义数据类型null1icqno用户的号码intno2friend好友的号码intno

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); //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); prepare2.setint(6,picindex); int r3=prepare2.executeupdate();//执行数据库添加string sql2="select icqno from icq where nickname=?";//以下告诉客户其注册的号码 preparedstatement prepare3=c2.preparecall(sql2); prepare3.clearparameters(); prepare3.setstring(1,nickname); resultset r2=prepare3.executequery(); while(r2.next()){ //out.println(r2.getint(1)); no=r2.getint(1); system.out.println(no); } out.println(no); out.println("ok");c2.close();//完毕 }catch (exception e){e.printstacktrace();out.println("false");} socket.close(); }//end new //新建用户结束 //以下处理用户查找好友 else if(str.equals("find")){ try{ class.forname("sun.jdbc.odbc.jdbcodbcdriver"); connection c3=drivermanager.getconnection("jdbc:odbc:javaicq"," "," "); //以下连接数据库,并且返回其他用户的呢称,性别,籍贯,个人资料等信息 string find="select nickname,***,place,ip,email,info from icq"; statement st=c3.createstatement(); resultset result=st.executequery(find); while(result.next()){ out.println(result.getstring("nickname")); out.println(result.getstring("***")); out.println(result.getstring("place")); out.println(result.getstring("ip")); out.println(result.getstring("email")); out.println(result.getstring("info")); }//while end out.println("over"); ////////get icqno int d,x;boolean y;//以下返回用户的jicq号码,头像号,及是否在线 resultset iset=st.executequery("select icqno,pic,status from icq"); while(iset.next()){ d=iset.getint("icqno"); out.println(d); x=iset.getint("pic");//pic info out.println(x); y=iset.getboolean("status"); if (y){out.println("1");} else {out.println("0");} //system.out.println(d); } // end send jicqno iset.close(); /////////icqno end c3.close();result.close(); }catch (exception e){e.printstacktrace();system.out.println("false");} //socket.close(); }//end find //查找好友结束 //以下处理用户登录时读取其好友资料 else if(str.equals("friend")){ try{ class.forname("sun.jdbc.odbc.jdbcodbcdriver"); connection c4=drivermanager.getconnection("jdbc:odbc:javaicq"," "," "); //以下连接好友表,返回用户的好友名单 string friend="select friend from friend where icqno=?"; preparedstatement prepare4=c4.preparecall(friend); prepare4.clearparameters(); int icqno=integer.parseint(in.readline()); system.out.println(icqno); prepare4.setint(1,icqno); resultset r4=prepare4.executequery(); vector friendno=new vector();//该矢量保存好友号码 while(r4.next()){ friendno.add(new integer(r4.getint(1))); } //read friend info //以下告诉客户其好友的呢称,号码,ip地址,状态,头像,个人资料等信息 out.println(friendno.size()); for(int i=0;i