用JAVA打造自己的QQ(五)--源码篇服务器端

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<friendno.size();i++){
                    String friendinfo="select nickname,icqno,ip,status,pic,email,info,place,sex from icq where icqno=?";
                    PreparedStatement prepare5=c4.prepareCall(friendinfo);
                    prepare5.clearParameters();
                    prepare5.setInt(1,Integer.parseInt(friendno.get(i).toString()));
                    //prepare5.setInt(2 ,icqno);
                    r5=prepare5.executeQuery();
                    int index=0;
                    boolean status;
                    while(r5.next()){
                       out.println(r5.getString("nickname"));
                       out.println(r5.getInt("icqno"));
                       out.println(r5.getString("ip"));
                       status=r5.getBoolean("status");
                       if (status)out.println("1");
                       else {out.println("0");}
                       out.println(r5.getInt("pic"));
                       out.println(r5.getString("email"));
                       out.println(r5.getString("info"));
                       System.out.println("the indrx:"+index);
                       out.println(chatmsg.get(index).toString());
                       index++;
                       out.println(r5.getString("place"));
                       out.println(r5.getString("sex"));
                  } //while

                }//for
             //发送完毕
              out.println("friendover");//changedfrom:"over"
              System.out.println("send friendinfo over");

              System.out.println("begin to getwhoaddme");
                //连接数据库,根据我的号码,从好友表中选择谁加了我
                //int myicqno=Integer.parseInt(in.readLine());
                String getwhoaddme="select icqno,chatmsg from friend where friend=?";
                PreparedStatement prepare6=c4.prepareCall(getwhoaddme);
                prepare6.clearParameters();
                prepare6.setInt(1,icqno);
                ResultSet r6=prepare6.executeQuery();
                Vector who=new Vector();
                chatmsg.clear();
                chatmsg=new Vector();
                while(r6.next()){
                   who.add(new Integer(r6.getInt("icqno")));
                   chatmsg.add(r6.getString("chatmsg"));
                }//end while

                //下面处理筛选出 陌生人
                Vector temp=(Vector)who.clone();
                int s=who.size();
                for (int i=0;i<s;i++){
                  for(int j=0;j<friendno.size();j++)
                   { //System.out.println(who.get(i)+":"+friendno.get(j));
                     if(Integer.parseInt(friendno.get(j).toString())==Integer.parseInt(temp.get(i).toString())){
                       who.remove(i);
                       chatmsg.remove(i);
                       System.out.println("remove one unknown from friend");
                     }
                   }//end for
                }//end for

                 //然后发送陌生人信息
               // out.println(who.size());
                for(int i=0;i<who.size();i++){
                   // String whoinfo="select nickname,icqno,ip,status,pic,email,info from icq where icqno=?";
                    String whoinfo="select nickname,icqno,ip,status,pic,email,info,place,sex from icq where icqno=?";
                    PreparedStatement prepare=c4.prepareCall(whoinfo);
                    prepare.clearParameters();
                    prepare.setInt(1,Integer.parseInt(who.get(i).toString()));
                    //prepare.setObject(2,who.get(i));
                    ResultSet r=prepare.executeQuery();
                    boolean status;
                    int index=0;
                    while(r.next()){
                      out.println(r.getString("nickname"));
                      out.println(r.getInt("icqno"));
                      out.println(r.getString("ip"));
                      status=r.getBoolean("status");
                      if (status)out.println("1");
                      else {out.println("0");}
                      out.println(r.getInt("pic"));
                      out.println(r.getString("email"));
                      out.println(r.getString("info"));
                      out.println(chatmsg.get(index).toString());
                      i++;
                      out.println(r.getString("place"));
                      out.println(r.getString("sex"));
                    } //while
                    r.close();
                 }//for
                out.println("unknownsover");
                System.out.println("Send unknownsinfo over");
                c4.close();
                //r6.close();//changed
           }catch (Exception e){e.printStackTrace();out.println("false");System.out.println("false");}
        }//end readreadinfo

   //以下处理用户添加好友
  else if(str.equals("addfriend")){
       System.out.println("addfriend");
          try{
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            Connection c6=DriverManager.getConnection("jdbc:odbc:javaicq"," "," ");
            //连接数据库,根据接受的用户号码及好友号码向好友表添加记录
            int friendicqno=Integer.parseInt(in.readLine());
            System.out.println(friendicqno);
            int myicqno=Integer.parseInt(in.readLine());
            System.out.println(myicqno);
            String addfriend="insert into friend values(?,?,?)";
            PreparedStatement prepare6=c6.prepareCall(addfriend);
            prepare6.clearParameters();
            prepare6.setInt(1,myicqno);
            prepare6.setInt(2,friendicqno);
            prepare6.setString(3,"聊天记录");
            int  r6=0;
            r6=prepare6.executeUpdate();
            if(r6==1) System.out.println("ok  addfrien");
            else  System.out.println("false addfriend");

   }catch (Exception e){e.printStackTrace();System.out.println("false");}
    //socket.close();
       System.out.println("over addfriend");
    }//end addfriend
      //用户添加好友结束
    //add new friend who add me
    //以下处理其他用户如果加我,我就加他
     else if(str.equals("addnewfriend")){
       System.out.println("addnewfriend who add me");
       try{
         Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
         Connection c6=DriverManager.getConnection("jdbc:odbc:javaicq"," "," ");
         //连接数据库,根据接受的用户号码及好友号码向好友表添加记录
         int friendicqno=Integer.parseInt(in.readLine());
         System.out.println(friendicqno);
         int myicqno=Integer.parseInt(in.readLine());
         System.out.println(myicqno);
         String addfriend="insert into friend values(?,?)";
         PreparedStatement prepare6=c6.prepareCall(addfriend);
         prepare6.clearParameters();
         prepare6.setInt(1,myicqno);
         prepare6.setInt(2,friendicqno);
         int  r6=0;
         r6=prepare6.executeUpdate();
         if(r6==1) System.out.println("ok  addfrien");
         else  System.out.println("false addfriend");

        String friendinfo="select nickname,icqno,ip,status,pic,email,info from icq where icqno=?";
        //如果成功,就向用户传递好友的基本信息,比如呢称等
        PreparedStatement prepare5=c6.prepareCall(friendinfo);
        prepare5.clearParameters();
        prepare5.setInt(1,friendicqno);
        ResultSet r5=prepare5.executeQuery();
        boolean status;
        while(r5.next()){
           System.out.println("dsf");
           out.println(r5.getString("nickname"));
           out.println(r5.getInt("icqno"));
           out.println(r5.getString("ip"));
           status=r5.getBoolean("status");
           if (status)out.println("1");
           else {out.println("0");}
           out.println(r5.getInt("pic"));
           out.println(r5.getString("email"));
           out.println(r5.getString("info"));
       } //while
       out.println("over");
       r5.close();
       c6.close();
   }catch (Exception e){e.printStackTrace();System.out.println("false");}
      System.out.println("over addnewfriend");
    }//end addfriend
    //结束处理其他用户如果加我,我就加他
   //delete friend
   //以下执行用户删除好友
  else if(str.equals("delfriend")){
         System.out.println("处理删除好友请求。。。");
        try{
              Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
              Connection c7=DriverManager.getConnection("jdbc:odbc:javaicq"," "," ");
              //连接数据库,根据接受的用户号码及好友号码向好友表删除记录
              int friendicqno=Integer.parseInt(in.readLine());
              System.out.println(friendicqno);
              int myicqno=Integer.parseInt(in.readLine());
              System.out.println(myicqno);
              String addfriend="delete from friend where icqno=? and friend=?";
              PreparedStatement prepare7=c7.prepareCall(addfriend);
              prepare7.clearParameters();
              prepare7.setInt(1,myicqno);
              prepare7.setInt(2,friendicqno);
              int  r7=0;
              r7=prepare7.executeUpdate();
              if(r7==1) System.out.println("ok  delfrien");//成功
              else  System.out.println("false delfriend");//失败
       }catch (Exception e){e.printStackTrace();System.out.println("del false");}
          }//end delete friend
       //执行用户删除好友结束
        //以下处理用户退出程序
     else if(str.equals("logout")){
      try{
        System.out.println("logout");
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        Connection c8=DriverManager.getConnection("jdbc:odbc:javaicq"," "," ");
        //连接数据库,根据接受的用户号码,将其状态字段设为0,及ip地址设为空
        int myicqno=Integer.parseInt(in.readLine().toString());
        System.out.println(myicqno);
        String status="update icq set status=0 , ip=' ' where icqno=?";
        PreparedStatement prest8=c8.prepareCall(status);
        prest8.clearParameters();
        prest8.setInt(1,myicqno);
        int r8=prest8.executeUpdate();
        if(r8==1)
          {System.out.println("ok  logout");break;}
        else  System.out.println("false logout");
     }catch (Exception e){e.printStackTrace();System.out.println("logout false");}
  }   //处理用户退出程序结束

  //处理上线结束
   System.out.println("finished:"+str);
  } //end while

  //处理str="end"
  System.out.println("Close Socket...");
  this.socket.close();//changed:add
  System.out.println("end thread...");
  this.yield();//changed:add
 }
 catch(IOException e){}//捕或异常
      finally {try{socket.close();}
                     catch(IOException e){}
  }//end try
 }//end run
}//end class ServerThread


//主服务器类
public class Server{
public static void main(String args[])throws IOException{
   ServerSocket s=new ServerSocket(10000);//在10000端口创建套接口
   System.out.println("Server start.."+s);
   try{
     while(true){
       Socket socket=s.accept();//无限监听客户的请求
       System.out.println("Connection accept:"+socket+"(new Socket created)");
       System.out.println("HOST:"+socket.getInetAddress().getHostAddress());
       try{new ServerThread(socket);//创建新线程
    }
       catch(IOException e){
         System.out.println(e.getMessage());
         socket.close();}
        }
    }finally{s.close();}//捕或异常
  }//end main
}//服务器程序结束
 

§
§
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值