您当前所在位置:

怎样用JAVA制作ICQ

2013-09-03

二.设计

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用户的头像号IntYes8Sex用户性别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( ew)){ 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,sex,place,ip,email,info from icq; Statement st=c3.createStatement(); ResultSet result=st.executeQuery(find); while(result.next()){ out.println(result.getString( ickname)); out.println(result.getString(sex)); 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();} //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