2009년 02월 11일
Socket & Thread를 이용한 은행 입출금 프로그램

Server 프로그램
ServerBank 폴더 / serverbank 패키지
1. ServerBank 클래스(Main)
package serverbank;
import java.net.*;
import java.util.*;
public class ServerBank {
public static void main(String[] args) {
ServerSocket serverSocket = null;
ArrayList<ClientInfo> client = null;
client = new ArrayList<ClientInfo>();
client.add(new ClientInfo(11, "조주희", 5000));
client.add(new ClientInfo(22, "박선혜", 3000));
client.add(new ClientInfo(33, "황혜정", 2000));
client.add(new ClientInfo(44, "장민혜", 4000));
try{
serverSocket = new ServerSocket(9000);
while(true) {
Socket socket = serverSocket.accept();
Thread thread = new ServerThread(socket, client);
thread.start();
}
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
2. ClientInfo 클래스
package serverbank;
public class ClientInfo extends ServerBank{
int account;
String sname;
int balance;
ClientInfo(int account, String sname, int balance){
this.account = account;
this.sname = sname;
this.balance = balance;
}
}
3. ServerThread 클래스
package serverbank;
import java.net.*;
import java.util.*;
import java.io.*;
public class ServerThread extends Thread {
static List<PrintWriter> list = new ArrayList<PrintWriter>();
Socket socket;
int account;
String sname;
int balance;
int depomoney;
int amount;
String menu = "< 거래 메뉴 > 1. 예 금 2. 출 금 3. 예금 현황 4. 종 료 ▶ 메뉴번호를 입력해주세요 ";
int menunum;
boolean flag = true;
String err = "잔액이 부족합니다. ";
PrintWriter writer;
ArrayList<ClientInfo> client;
ServerThread(Socket socket, ArrayList<ClientInfo> client) {
this.socket = socket;
this.client = client;
try {
writer = new PrintWriter(socket.getOutputStream());
list.add(writer);
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
public void run(){
while(flag) {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//계좌번호를 읽음
account = Integer.parseInt(reader.readLine());
//계좌번호, 이름, 잔액을 보내기 위해 검색
Iterator it = client.iterator();
while(it.hasNext()) {
try {
//ClientInfo 클래스에 한 고객을 객체로 만듬
ClientInfo out = (ClientInfo) it.next();
//계좌번호를 비교함
if(out.account == account) {
//계좌번호, 이름, 잔액을 보냄
writer.println("* 계좌번호 : " + out.account + " * 이름 : " + out.sname + " * 잔액 : " + out.balance);
writer.flush();
flag = true;
while(flag) {
//메뉴를 보냄
writer.println(menu);
writer.flush();
//메뉴번호를 받음
menunum = Integer.parseInt(reader.readLine());
//메뉴를 선택했을 때 내용
switch(menunum) {
//입금 메뉴
case 1:
//입금액을 읽어옴
depomoney = Integer.parseInt(reader.readLine());
//잔액에 입금액을 더해줌
out.balance += depomoney;
writer.println("현재 잔액은 "+ out.balance+"원 입니다.");
writer.flush();
break;
//출금 메뉴
case 2:
//출금액을 읽어옴
amount = Integer.parseInt(reader.readLine());
//출금액이 잔액보다 클 경우
if(out.balance < amount) {
//에러 메시지를 보냄
writer.println(err+menu);
writer.flush();
}
//그렇지 않을 경우 잔액에 출금액을 빼줌
else {
out.balance -= amount;
writer.println("현재 잔액은 "+ out.balance+"원 입니다.");
writer.flush();
}
break;
//예금현황 메뉴
case 3:
writer.println(out.account);
writer.flush();
writer.println(out.sname);
writer.flush();
writer.println(out.balance);
writer.flush();
break;
//1,2,3입력 받지 않은 경우 종료
default:
flag = false;
}
}
}
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
Client 프로그램
ClientBank 폴더 / clientbank 패키지
1. ClientBank 크래스 ( Main)
package clientbank;
import java.net.*;
public class ClientBank {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1", 9000);
Thread thread = new ClientThread(socket);
thread.start();
}
catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
2. ClientThread 클래스
package clientbank;
import java.net.*;
import java.io.*;
public class ClientThread extends Thread{
Socket socket;
int account;
String sname;
int balance;
int depomoney;
int amount;
String menu = null;
int menunum;
boolean flag = true;
ClientThread(Socket socket) {
this.socket = socket;
}
public void run() {
while(flag) {
try{
BufferedReader reader = new BufferedReader (new InputStreamReader(socket.getInputStream()));
BufferedReader in = new BufferedReader (new InputStreamReader(System.in));
PrintWriter writer = new PrintWriter(socket.getOutputStream());
System.out.println("계좌번호를 입력해주세요");
//계좌번호를 입력받음
account = Integer.parseInt(in.readLine());
//계좌번호를 보냄
writer.println(account);
writer.flush();
// 계좌번호, 이름, 잔액을 읽음
Object client = reader.readLine();
System.out.println(client);
flag = true;
while(flag) {
//메뉴를 읽음
menu = reader.readLine();
System.out.println(menu);
//메뉴번호를 입력받음
menunum = Integer.parseInt(in.readLine());
//메뉴번호를 보냄
writer.println(menunum);
writer.flush();
//선택할 수 있는 메뉴 내용
switch(menunum) {
//입금메뉴
case 1:
//입금액을 입력받음
System.out.println("* 입금액 :");
depomoney = Integer.parseInt(in.readLine());
//입금액을 보냄
writer.println(depomoney);
writer.flush();
System.out.println(reader.readLine());
System.out.println(" ");
break;
//출금메뉴
case 2:
//출금액을 입력받음
System.out.println("* 출금액 :");
amount = Integer.parseInt(in.readLine());
//출금액을 보냄
writer.println(amount);
writer.flush();
System.out.println(reader.readLine());
System.out.println(" ");
break;
//예금현황 메뉴
case 3:
//계좌번호를 읽음
account = Integer.parseInt(reader.readLine());
//이름을 읽음
sname = reader.readLine();
//잔액을 읽음
balance = Integer.parseInt(reader.readLine());
//예금현황 형식
System.out.println("-----------*예금 현황*------------");
System.out.println(" 계좌번호 이름 잔액 ");
System.out.println(" " + account + " " + sname + " " + balance);
System.out.println("---------------------------------");
break;
default:
flag = false;
}
}
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
}
# by | 2009/02/11 18:13 | JAVA | 트랙백 | 덧글(0)




