atm_server.java

来自「简单ATM(Automatic Teller Machine)系统的基本功能包括」· Java 代码 · 共 277 行

JAVA
277
字号
package atm;

/**
 * <p>Title: </p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2007</p>
 *
 * <p>Company: </p>
 *
 * @author Liangwen
 * @version 1.0
 */
import java.io.* ;
import java.net.* ;
import java.sql.*;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Connection;

public class ATM_server
{
        public static void main(String argv[]) throws Exception
        {
            // Establish the listen socket.
            ServerSocket ss=new ServerSocket(Msg.PORTNUM);
            System.out.println("A Multi-Threaded ATM Server starting......");
            // Process service requests in an infinite loop.
            while (true) {
                // Listen for a TCP connection request.
                Socket s=ss.accept();
                // Construct an object to process the HTTP request message.
                ATMRequest request = new ATMRequest(s);
                // Create a new thread to process the request.
                Thread thread = new Thread(request);
                // Start the thread.
               thread.start();
              // request.run();
           }
        }
}

final class ATMRequest implements Runnable
{
        private Socket socket;
        private BufferedReader is;
        private PrintStream out;
        private String currentAccount;
        private Connection con;      //数据库连接对象
        private Statement stmt;      //用于执行SQL语句
        private ResultSet rset;      //用于存储SQL查询的返回结果
        private String databaseDriver="sun.jdbc.odbc.JdbcOdbcDriver";
        private String databaseName="jdbc:odbc:account";


        // Constructor
        public ATMRequest(Socket socket) throws Exception
        {
                this.socket = socket;
        }

        // Implement the run() method of the Runnable interface.
        public void run()
        {
            try {
                // Set up input and output stream filters.
                   is =new BufferedReader(
                      new InputStreamReader(this.socket.getInputStream()));
                   out = new PrintStream(this.socket.getOutputStream());

                   this.openConnenction();
                   processRequest();

                   closeConnection();
                   // Close streams and socket.
                    is.close();
                    out.close();
                    socket.close();
                } catch (Exception e) {
                    //System.out.println(e.toString());
                }
        }

        private void processRequest() throws Exception
        {
               String line;
               String temp,msg;
               int index;
               while ((line = is.readLine()) != null) {
                        System.out.println("Received: "+line);
                        char cmd=line.charAt(0);
                        line=line.substring(1);
                        switch(cmd)
                        {
                        case Msg.CMD_LOGIN:
                            index=line.indexOf(Msg.SEPARATOR);
                            if(login(line.substring(0,index),line.substring(index+1)))
                                msg=Character.toString(Msg.CMD_LOGIN)+Character.toString(Msg.SUCCESSFUL);
                           else
                                msg=Character.toString(Msg.CMD_LOGIN)+Character.toString(Msg.FAILED);
                             out.println(msg);
                             break;
                         case Msg.CMD_QUERY:
                             temp=this.queryBalance(this.currentAccount);
                             if(temp==null)
                                 msg=Character.toString(Msg.CMD_QUERY)+Character.toString(Msg.FAILED);
                             else
                                 msg=Character.toString(Msg.CMD_QUERY)+temp;
                             out.println(msg);
                             break;
                         case Msg.CMD_CHANGE:
                             if(updatePassword(this.currentAccount,line))
                                msg=Character.toString(Msg.CMD_CHANGE)+Character.toString(Msg.SUCCESSFUL);
                           else
                                msg=Character.toString(Msg.CMD_CHANGE)+Character.toString(Msg.FAILED);
                             out.println(msg);
                             break;
                         case Msg.CMD_WITHDROW:
                             if(updateBalance(this.currentAccount,line,0))
                                msg=Character.toString(Msg.CMD_WITHDROW)+Character.toString(Msg.SUCCESSFUL);
                             else
                                msg=Character.toString(Msg.CMD_WITHDROW)+Character.toString(Msg.FAILED);
                             out.println(msg);
                             break;
                         case Msg.CMD_DEPOSIT:
                             if(updateBalance(this.currentAccount,line,1))
                                msg=Character.toString(Msg.CMD_DEPOSIT)+Character.toString(Msg.SUCCESSFUL);
                           else
                                msg=Character.toString(Msg.CMD_DEPOSIT)+Character.toString(Msg.FAILED);
                             out.println(msg);
                             break;
                         case Msg.CMD_QUIT:
                             return;
                        }
                }
        }
        private boolean login(String account,String pwd)
        {
             try
               {
                 //查询帐户口令是否正确
                 String strSQL="select * from account where account="
                               +account+" and password="+pwd;
                 //执行SQL查询语句
                 this.rset=stmt.executeQuery(strSQL);
                 if(rset.next())   //判断是否有需要的查询值
                 {
                     this.currentAccount = account;
                     return true;
                 }
                 else
                     return false;
                }
                catch(Exception e)
                 {
                     System.out.println(e.toString());
                      return false;
                 }
         }
         private String queryBalance(String account)
         {
             try
              {
                //查询余额
                String strSQL="select balance from account where account="
                              +account;
                //执行SQL查询语句
                this.rset=stmt.executeQuery(strSQL);
                if(rset.next())   //判断是否有需要的查询值
                {
                    String balance=rset.getString(1);
                    return balance;
                }
                else
                    return null;
               }
               catch(Exception e)
                {
                     return null;
                }
            }
            //type=0表示取款,type=1表示存款
           private boolean updateBalance(String account,String balanceUpdate,int type)
           {
                try
                  {
                      String strSQL;
                      //更新新纪录
                      if (type == 0) {
                          long oldBalance;
                          //查询原余额
                          strSQL = "select balance from account where account="
                                          + account;
                          //执行SQL查询语句
                          this.rset = stmt.executeQuery(strSQL);
                          if (rset.next()) //判断余额是否充足
                          {
                              oldBalance = rset.getLong(1);
                              if(oldBalance < Integer.parseInt(balanceUpdate))
                                  return false;
                          }
                          else
                              return false;
                          strSQL = "update account set balance = balance-" +
                                   balanceUpdate
                                   + " where account=" + account;
                      } else
                          strSQL = "update account set balance = balance+" +
                                   balanceUpdate
                                   + " where account=" + account;
                      //执行SQL更新语句
                      stmt.executeUpdate(strSQL);
                      return true;
                  }
                   catch(Exception e)
                    {
                         return false;
                    }
            }

        private boolean updatePassword(String account,String pwd)
        {
             try
               {
                 //更新新纪录
                 String strSQL="update account set password="+pwd
                               +" where account="+account;
                 //执行SQL更新语句
                 stmt.executeUpdate(strSQL);
                 return true;
                }
                catch(Exception e)
                 {
                     System.out.println(e.toString());
                      return false;
                 }
         }


                //连接数据库函数
                private boolean openConnenction()
                {
                try
                  {
                      //加载数据库驱动程序
                      Class.forName(databaseDriver);
                      //根据用户名和密码,建立与数据库的连接
                      con = DriverManager.getConnection(databaseName);
                      //创建Statement对象
                      stmt = con.createStatement();
                      return true;
                  }
                 catch(Exception ex)
                 {
                        System.out.println("加载数据库驱动程序出现异常\n"+ex.toString());
                        return false;
                 }
               }
               //关闭数据库连接
                private boolean closeConnection()
                {
                    try
                    {
                        rset.close();
                        stmt.close();
                        con.close();
                        return true;
                    }
                     catch(Exception ex)
                     {
                         System.out.println(ex.toString());
                         return false;
                     }
        }
}

⌨️ 快捷键说明

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