⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.java~35~

📁 本系统充分利用了Java语言的平台无关性等众多优点
💻 JAVA~35~
📖 第 1 页 / 共 2 页
字号:
package server;

/**
 * <p>Title: MyQQ</p>
 * <p>Description: MyQQ</p>
 * <p>Copyright: Copyright (c) 2007</p>
 * <p>Company:  南昌大学软件学院 04级网通1班</p>
 * @author 张利彬
 * @version 1.0
 */
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; //定义申请的QQ号码
  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(); //取得输入字符串
        /*读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。
         返回:
         包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
         */
        if (str.equals("end"))
          break; //如果是结束就关闭连接
        else if (str.equals("login")) { //如果是登录
          try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //装载驱动,连接数据库
            Connection c = DriverManager.getConnection("jdbc:odbc:javaicq",
                "sa", "shift");
            /*DriverManager管理一组 JDBC 驱动程序的基本服务。
             在调用 getConnection 方法时,DriverManager 会试着从初始化时
             加载的那些驱动程序以及使用与当前 applet 或应用程序相同的类加载器
             显式加载的那些驱动程序中查找合适的驱动程序。
             */
            String sql = "select nickname,password from icq where icqno=?";
            //准备从数据库选择呢称和密码
            PreparedStatement prepare = c.prepareCall(sql);
            //创建一个 prepareCall 对象来调用数据库存储过程。
            //prepareCall 对象提供了设置其 IN 和 OUT 参数的方法,以及用来执行调用存储过程的方法。
            //设定数据库查寻条件,
            /*创建一个 PreparedStatement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。
                         创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。
             带有 IN 参数或不带有 IN 参数的 SQL 语句都可以被预编译并存储在 PreparedStatement 对象中。
             然后可以有效地使用此对象来多次执行该语句。
             */
            String icqno = in.readLine();//从文件中读取字节,并将其转换为字符后返回
            int g = Integer.parseInt(icqno);
           //取得输入的QQ号码,parseInt(icqno)将字符串参数作为有符号的十进制整数进行解析
            System.out.println(icqno);
            String passwd = in.readLine().trim(); //取得输入的密码,返回字符串的副本,忽略前导空白和尾部空白。
            System.out.println(passwd);
            prepare.clearParameters();
            prepare.setInt(1, g);
            /*设定参数,setInt
               void setInt(int parameterIndex,
              int x)
              throws SQLException
              将指定参数设置为给定 Java int 值。在将该对象发送到数据库时,
              驱动程序将它转换成一个 SQL INTEGER 值。
               参数:
               parameterIndex - 第一个参数是 1,第二个参数是 2,依此类推。
               x - 参数值
               抛出:
               SQLException - 如果发生数据库访问错误
             */
            ResultSet r = prepare.executeQuery(); //执行数据库查寻
            /*表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
                         ResultSet 对象具有指向其当前数据行的指针。最初,指针被置于第一行之前。
                        next 方法将指针移动到下一行;因为该方法在 ResultSet 对象中没有下一行时返回 false,
                        所以可以在 while 循环中使用它来迭代结果集。
                        默认的 ResultSet 对象不可更新,仅有一个向前移动的指针。
                        因此,只能迭代它一次,并且只能按从第一行到最后一行的顺序进行。
                        可以生成可滚动和/或可更新的 ResultSet 对象。
             */
            if (r.next()) { //以下比较输入的号码于密码是否相同
              String pass = r.getString("password").trim();
              System.out.println(pass);
              if (passwd.regionMatches(0, pass, 0, pass.length())) {
                //通常使用 region 作为标识将应用特殊样式的 Component 和区域的方法设置此匹配的区域限制。。
                /*matches 方法尝试将整个输入序列与该模式匹配。尝试将整个区域与模式匹配。
                                如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。
                                返回:
                                当且仅当整个区域序列匹配此匹配器的模式时才返回 true。
                 */
                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();
                /*executeUpdate
                 int executeUpdate()
                  throws SQLException在此 PreparedStatement 对象中执行 SQL 语句,
                 该语句必须是一个 SQL INSERT、UPDATE 或 DELETE 语句;
                 或者是一个什么都不返回的 SQL 语句,比如 DDL 语句。
                 返回:
                 (1) 对于 INSERT、UPDATE 或 DELETE 语句,返回行数
                 (2) 或者对于什么都不返回的 SQL 语句,返回 0
                 抛出:
                 SQLException - 如果发生数据库访问错误或者 SQL 语句返回一个 ResultSet 对象
                 */
                System.out.println("ip=" +
                                   socket.getInetAddress().getHostAddress() +
                                   "   " + 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("status = 1  " + 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",
                "sa", "shift");
            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",
                "sa", "shift");
            //以下连接数据库,并且返回其他用户的呢称,性别,籍贯,个人资料等信息
            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("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"));
            } //while end
            out.println("over");
            ////////GET QQNO
            int d, x;
            boolean y;
//以下返回用户的qq号码,头像号,及是否在线
            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",
                "sa", "shift");
//以下连接好友表,返回用户的好友名单
            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)));
            }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -