📄 bamclient.java
字号:
package bamclient;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.net.*;import java.io.*;import java.util.*;import Exception.*;import model.*;import business.*;public class BAMClient { /* * BAMClient 其中会包含一个Frame,这是用户主界面 * MainPanel:主界面,用户可以选择开户或者登录 * RegisterPanel:用户开户填写详细信息用到的界面 * LoginPanel:用户登录是填写信息时需要的界面 * BusinessPanel:界面上会显示账户的功能至少包括存款和取款; * 对于可透支的用户,还允许用户修改透支额度; * 对于贷款用户,还允许用户贷款和还贷款; */ private JFrame frame; private MainPanel mp = new MainPanel(); private RegisterPanel rp = new RegisterPanel(); private LoginPanel lp = new LoginPanel(); private BusinessPanel bp = new BusinessPanel(); private CardLayout layout = new CardLayout(); private Account account; private Socket s; private ObjectOutputStream out; private ObjectInputStream in; public BAMClient() throws Exception { frame = new JFrame("BAM Client"); frame.setSize(350, 300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(layout); frame.add("main", mp); frame.add("register", rp); frame.add("login", lp); frame.add("business", bp); frame.setVisible(true); addListeners(); /* * 创建用户端的socket,并且指定ip 地址和端口; * 因为网络中传送的都是一个个处理的客户对象,或者是异常对象, * 所以要分别创建对象输出流和对象输入流; * 对象输出流:将收集的用户信息封装到客户对象中之后写如对象输出流中; * 对象输入流:将服务器端处理的结果(对象)传回给客户; */ try { s = new Socket("127.0.0.1", 9000); out = new ObjectOutputStream(s.getOutputStream()); in = new ObjectInputStream(s.getInputStream()); } catch (ConnectException e) { } catch (NullPointerException e) { } } private void addListeners() { // 在主界面上点击开户,CardLayout翻到RegisterPanel mp.getRegisterButton().addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { layout.show(frame.getContentPane(), "register"); } }); // 在主界面上点击登录,CardLayout翻到LoginPanel mp.getLoginButton().addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { layout.show(frame.getContentPane(), "login"); } }); // 在开户界面上点击提交按钮 rp.getOkButton().addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { register(); } }); // 在登录界面上点击提交按钮 lp.getOkButton().addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { login(); } }); // 在交易界面上点击提交按钮 bp.getOkButton().addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { business(); } }); } /* * 注册,将收集的客户所以信息封装到Info对象中,然后再将Info对象通过网络 * 传递给服务器处理,然后将结果返回给客户; */ private void register() { try { /* * 收集用户的开户信息 * 其中type是用来记录用户注册时,用户的性质(哪个类型的卡); */ String pass1 = new String(rp.getPassField1().getPassword()); String pass2 = new String(rp.getPassField2().getPassword()); String name = rp.getNameField().getText(); String personId = rp.getPersonIdField().getText(); String email = rp.getEmailField().getText(); int type = rp.getTypeBox().getSelectedIndex(); /* * 封装Info对象,序列化到网络中 Info对象中封装了客户的 * 注册信息和客户的动作, Info对象中的HashMap中封装了客户的注册信息, * 其中键值type的value值是记录了用户开户的类型 */ Info inf = new Info(Info.REGISTER); HashMap m = inf.getData(); m.put("pass1", pass1); m.put("pass2", pass2); m.put("name", name); m.put("personId", personId); m.put("email", email); m.put("type", new Integer(type)); out.writeObject(inf); out.flush(); /* * 从网络中读取服务器处理的结果,有两种情况: * 一是:正确情况下返回一个用户对象;并且返回给用户一个用户可以操作的界面(可交易界面); * 二是:错误情况下返回一个异常对象;弹出一个错误的对话框; */ Object o = in.readObject(); if (o instanceof Account) { account = (Account) o; bp.initComponent(account); bp.setText(account); layout.show(frame.getContentPane(), "business"); System.out.println("注册成功!"); } else { JOptionPane.showMessageDialog(frame, (String) o); } } catch (HeadlessException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /* * 登录,注意设置account属性 本系统是通过卡号和密码来确认用户身份的, * 所以要先收集用户的卡号和密码, 收集信息完成之后同样把所有信息封装 * 到Info对象中,然后写到网络中,让服务器来处理相应的数据和动作; */ private void login() { try { String id = lp.getIdField().getText(); String pass = new String(lp.getPassField().getPassword()); long lid = Long.parseLong(id); Info inf = new Info(Info.LOGIN); HashMap data = inf.getData(); data.put("id", lid); data.put("pass", pass); out.writeObject(inf); out.flush(); /* * 从网络中读取服务器处理的结果,有两种情况: * 一是:正确情况下返回一个用户对象;并且返回给用户一个用户可以操作的界面(可交易界面); * 二是:错误情况下返回一个异常对象;弹出一个错误的对话框; */ Object o = in.readObject(); if (o instanceof Account) { account = (Account) o; bp.initComponent(account); bp.setText(account); layout.show(frame.getContentPane(), "business"); System.out.println("登录成功 !"); } else { JOptionPane.showMessageDialog(frame, (String) o); } } catch (NumberFormatException e) { e.printStackTrace(); } catch (HeadlessException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /* * 交易,在交易界面中,客户可以做一些自己合法的操作(存款,取款,贷款,还款等); * 仍然将交易时要处理的数据封装到Info对象中; * 将客户选择的业务类型,操作类型,金额和卡号一起封装到Info对象中, * 同时写入网络中交给服务器处理; */ private void business() { try { String choice = (String) bp.getChoiceBox().getSelectedItem(); String sm = bp.getInputField().getText(); double money = Double.parseDouble(sm); long id = account.getId(); Info inf = new Info(Info.BUSINESS); HashMap data = inf.getData(); data.put("choice", choice); data.put("money", money); data.put("id", id); out.writeObject(inf); out.flush(); /* * 从网络中读取服务器处理的结果,有两种情况: * 一是:正确情况下返回一个用户对象;并且返回给用户一个用户可以操作的界面(可交易界面); * 二是:错误情况下返回一个异常对象;弹出一个错误的对话框; */ Object o = in.readObject(); if (o instanceof Account) { account = (Account) o; bp.setText(account); System.out.println("交易成功!"); } else { JOptionPane.showMessageDialog(frame, (String) o); } } catch (NumberFormatException e) { e.printStackTrace(); } catch (HeadlessException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /* * 创建客户端,能使客户与服务器通信,完成相应的功能; */ public static void main(String[] args) throws Exception { new BAMClient(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -