?? 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(); /* * 創(chuàng)建用戶端的socket,并且指定ip 地址和端口; * 因為網絡中傳送的都是一個個處理的客戶對象,或者是異常對象, * 所以要分別創(chuàng)建對象輸出流和對象輸入流; * 對象輸出流:將收集的用戶信息封裝到客戶對象中之后寫如對象輸出流中; * 對象輸入流:將服務器端處理的結果(對象)傳回給客戶; */ 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屬性 本系統(tǒng)是通過卡號和密碼來確認用戶身份的, * 所以要先收集用戶的卡號和密碼, 收集信息完成之后同樣把所有信息封裝 * 到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對象中; * 將客戶選擇的業(yè)務類型,操作類型,金額和卡號一起封裝到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(); } } /* * 創(chuàng)建客戶端,能使客戶與服務器通信,完成相應的功能; */ public static void main(String[] args) throws Exception { new BAMClient(); }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -