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 + -
显示快捷键?