Java即时通信系统的服务器端包括JICQ服务器程序和数据库服务器;客户端为JICQ即时通信工具软件。 服务器端JICQ主要由监听线程、线程调度池、消息处理线程组成。首先由监听线程监听,并启动线程池,当有消息来到时,从线程池取得线程,并将消息交由其处理,由消息处理线程处理用户注册、登陆、注销、添加删除好友等请求,将处理结果写入数据库,最后向客户端返回消息,消息处理线程在完成工作之后,再重新回到线程池,等待下一次重新被利用。服务器对客户端JICQ的响应逻辑 : 1.对用户注册功能响应 ; 2.对用户登陆的响应; 3.对用户注销的响应; 4.对用户搜索的响应; 5.对添加好友的响应; 6.对删除好友的响应. 下面是我写的服务器端源码: package Server; 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")){System.out.println("receive 'end'");break;}//如果是结束就关闭连接 else if(str.equals("login")) {//如果是登录 try{ System.out.println("login"); Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//连接数据库 Connection c=DriverManager.getConnection("jdbc:odbc:javaicq"," "," "); String sql="select nickname,password,ip,status,pic,email,info,place,sex from icq where icqno=?"; //准备从数据库选择呢称和密码 PreparedStatement prepare=c.prepareCall(sql);//设定数据库查寻条件 String icqno=in.readLine(); int g=Integer.parseInt(icqno);//取得输入的jicq号码 System.out.println("the icpno login:"+icqno); String passwd=in.readLine().trim();//取得输入的密码 System.out.println("the password received:"+passwd); prepare.clearParameters(); prepare.setInt(1,g);//设定参数 ResultSet r=prepare.executeQuery();//执行数据库查寻 if(r.next()){//以下比较输入的号码于密码是否相同 String pass = r.getString("password").trim(); System.out.println("the password from database:" + pass); //如果相同就告诉客户ok //并且更新数据库用户为在线 //以及注册用户的ip 地址 if(passwd.regionMatches(0,pass,0,pass.length())) { //if (passwd.equals(pass)) { System.out.println("password matched successfully"); //out.println("ok"); // System.out.println("send 'OK' to client"); //*************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); //g为取得输入的jicq号码 int set = prest.executeUpdate(); System.out.println("update IP Status:"+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); //g为取得输入的jicq号码 int set2 = prest2.executeUpdate(); System.out.println("set the icqno status online(1):"+set2); //set online out.println("ok"); System.out.println("send 'OK' to client,login finished"); //开始发送登录者的个人信息 out.println(r.getString("nickname")); out.println(r.getString("ip")); out.println(r.getString("status")); out.println(r.getString("pic")); out.println(r.getString("email")); out.println(r.getString("info")); out.println(r.getString("place")); out.println(r.getString("sex")); System.out.println("Send the loginer's info successfully"); } //否者告诉客户失败 else { System.out.println("password error!"); out.println("pwderror");///////////////////////////////////////////////////// send false r.close(); c.close(); } } else{ System.out.println("the icqno is wrong,not in the db!"); out.println("usererror");/////////////////////////////////////////////////////// send false System.out.println("send false"); r.close(); c.close(); } }catch (Exception e){ out.println("false"); e.printStackTrace();} socket.close();break; }//end login //登录结束 //以下为处理客户的新建请求 else if(str.equals("new")){ try{ System.out.println("new"); Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//连接数据库 Connection c2=DriverManager.getConnection("jdbc:odbc:javaicq"," "," "); //以下为查询表icp的总人数 String totalSql="select * from icq"; Statement totalstmt=c2.createStatement(); ResultSet rsTotal=totalstmt.executeQuery(totalSql); int total=0; //System.out.println("whether is the first row:"+rsTotal.isFirst()); while(rsTotal.next()) total++;//tochange rsTotal.close(); String newsql="insert into icq(nickname,password,email,info,place,pic,sex,ip,icqno) 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()); String sex=in.readLine();/////////////////////////////changed:add String ip=in.readLine();/////////////////////////////changed:add 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); prepare2.setString(7,sex);//changed:add prepare2.setString(8,ip);//changed:add prepare2.setInt(9,total);//changed:add int r3=prepare2.executeUpdate();//执行数据库添加 String sql2="select icqno from icq where nickname=?";//tochang:if two person has same name, //the following will return two icqno. //以下告诉客户其注册的号码 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");System.out.println("send false");}///////////////////////////////////////////////////// send 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 cmd=in.readLine().toString(); if(cmd.equals("getonline")){ System.out.println("findOnlines"); String find = "select nickname,sex,place,ip,email,info,pic,icqno from icq where status=true"; Statement st = c3.createStatement(); ResultSet result = st.executeQuery(find); //查询所有在线信息的发送次序:nickname sex place ip email info icqno pic while (result.next()) { out.println(result.getString("nickname")); 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")); out.println(result.getString("icqno")); out.println(result.getString("pic")); } //while end out.println("over"); c3.close(); //result.close(); //changed } else//查询特定用户 { System.out.println("查询特定用户"); String findcondition=in.readLine().trim(); if(findcondition.equals("jicq"))//按jicq号查询 { System.out.println("按JICQ查找"); int jicq = Integer.parseInt(in.readLine()); System.out.println("要查询的JICQ:"+jicq); String find = "select nickname,ip,status,pic,email,info,place,sex from icq where icqno=?"; PreparedStatement st = c3.prepareStatement(find); st.clearParameters(); st.setInt(1,jicq); ResultSet result = st.executeQuery(); //按JICQ查询信息的发送次序:nickname sex place ip email info jicq pic status while (result.next()) { out.println(result.getString("nickname")); 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")); out.println(jicq); out.println(result.getString("pic")); if(result.getBoolean("status")) out.println("1"); else out.println("0"); } //while end out.println("over"); System.out.println("发送查询信息成功"); c3.close(); //result.close(); //changed }//end if if(findcondition.equals("nickname")){ System.out.println("按nickname查找"); String name = in.readLine().toString(); System.out.println("要查询的nickname:"+name); String find = "select nickname,sex,place,ip,email,info,pic,icqno,status from icq where nickname=?"; PreparedStatement st = c3.prepareStatement(find); st.clearParameters(); st.setString(1,name); ResultSet result = st.executeQuery(); //按nickname查询信息的发送次序:nickname sex place ip email info icqno pic while (result.next()) { out.println(result.getString("nickname")); 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")); out.println(result.getString("icqno")); out.println(result.getString("pic")); if(result.getBoolean("status")) out.println("1"); else out.println("0"); } //while end out.println("over"); System.out.println("发送查询信息成功"); c3.close(); result.close(); //changed } if(findcondition.equals("email")){ System.out.println("按email查找"); String email = in.readLine().toString(); System.out.println("要查询的email:"+email); String find = "select nickname,sex,place,ip,email,info,pic,icqno,status from icq where email=?"; PreparedStatement st = c3.prepareStatement(find); st.clearParameters(); st.setString(1,email); ResultSet result = st.executeQuery(); //email信息发送次序:nickname sex place ip email info icqno pic while (result.next()) { out.println(result.getString("nickname")); 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")); out.println(result.getString("icqno")); out.println(result.getString("pic")); if(result.getBoolean("status")) out.println("1"); else out.println("0"); } //while end out.println("over"); System.out.println("发送查询信息成功"); c3.close(); //result.close(); //changed } } }catch (Exception e){e.printStackTrace();System.out.println("false");} //socket.close(); } //查找好友结束 else if(str.equals("readinfo")){ try{ //System.out.println("friend"); System.out.println("readinfo"); System.out.println("begin to read friends'info"); Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection c4=DriverManager.getConnection("jdbc:odbc:javaicq"," "," "); //以下连接好友表,返回用户的好友名单 String friend="select friend,chatmsg from friend where icqno=?"; PreparedStatement prepare4=c4.prepareCall(friend); prepare4.clearParameters(); int icqno=Integer.parseInt(in.readLine()); System.out.println("the icqno readed:"+icqno); prepare4.setInt(1,icqno); ResultSet r4=prepare4.executeQuery(); ResultSet r5; Vector friendno=new Vector();//该矢量保存好友号码 Vector chatmsg=new Vector(); while(r4.next()){ friendno.add(new Integer(r4.getInt("friend"))); chatmsg.add(r4.getString("chatmsg")); } //以下告诉客户其好友的呢称,号码,ip地址,状态,头像,个人资料等信息 //out.println(friendno.size()); System.out.println("send client the no of friends:"+friendno.size()); for(int i=0;i