[ 문제 ]
서버에 요청해 카드를 뽑아 비교해 봅시다. 서버로부터 제공 받는 정보는 카드의 문양(♠,♣,♥,◆)의 4가지 모양이 있고, 숫자는(1~ 10, K, Q, J)가 있습니다. 숫자 1의 경우 'A'로 취급합니다. 클라이언트에서 카드를 뽑아 서버로 해당 카드의 내용을 전송하고, 서버에서 카드를 뽑은 후 클라이언트 쪽으로 서버에서 뽑은 카드를 전송해 출력 후, 모양에 상관없이 숫자 끼리 비교를 하여 승패 처리를 해보세요. 숫자가 같은 경우 비긴 것으로 처리합니다. 승패는 2 < 3 < ... < 10 < J < Q < K < A 의 순서로 처리해야 합니다. 카드를 뽑는 기능은 객체를 호출해 구현해야 합니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
public class Solutin {
public static void main(String[] args) {
// Server와 통신하기 위한 포트 생성
int port = 8500;
BufferedReader br = null;
PrintWriter pw = null;
try {
// Server와 통신하기 위한 소켓 생성
String serverIP = InetAddress.getLocalHost().getHostAddress();
Socket socket = new Socket(serverIP, port);
if(socket != null) {
// Server와 통신하기 위한 입출력 Stream생성
InputStream input = socket.getInputStream();
OutputStream output = socket.getOutputStream();
// 성능 향상을 위한 Buffered Stream 생성
br = new BufferedReader(new InputStreamReader(input));
pw = new PrintWriter(output);
// 내 카드 뽑기
ArrayList card = new ArrayList();
Card toSelect = new Card();
card = toSelect.selectCard();
// PrintWriter를 통해 Server로 전송하기 위해 String으로 변환
String Message = card.get(0) + "," + card.get(1);
// 내가뽑은 카드 서버에 전송
pw.println(Message);
pw.flush();
// numTOChar를 이용해 1 == 'A', 11 == 'J', 12 == 'Q', 13 == 'K'로 변환후 출력
numToChar ntc = new numToChar();
System.out.println("내가 뽑은 카드: " + card.get(0) + "," + ntc.numberToChar(card.get(1) + ""));
// Server로부터 수신한 메시지 출력
// 1. 서버가 뽑은 카드 수신
String receiveMessage = br.readLine();
String[] serverCard = receiveMessage.split(",");
// 수신한 메시지 출력
String clientCardNum2 = ntc.numberToChar(serverCard[1] + "");
System.out.println("서버가 뽑은 카드: " + serverCard[0] + "," + ntc.numberToChar(clientCardNum2));
// 비교결과 수신위해 서버에 요청
pw.println("승패결과 출력");
// 2. 비교결과 수신
String receiveMessage2 = br.readLine();
System.out.println(receiveMessage2);
}
pw.close();
br.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
public class Server {
public static void main(String[] args) throws IOException {
// 통신을 위한 서버 생성.
int port = 8500;
ServerSocket server = new ServerSocket(port);
// 클라이언트 소켓을 생성하고 응답이 올떄까지 기다림.
while(true) {
Socket Client = server.accept();
// 클라이언트와 송수신을 위한 입출력 Stream생성
InputStream input = Client.getInputStream();
OutputStream output = Client.getOutputStream();
// 성능 향상을 위해 Buffer Stream 생성
BufferedReader br = new BufferedReader(new InputStreamReader(input));
PrintWriter pw = new PrintWriter(output);
// Server측 카드뽑기
ArrayList card = new ArrayList();
Card toSelect = new Card();
card = toSelect.selectCard();
String CardNum = toSelect.getCardNum();
/* Card method의 카드숫자가 String형 이므로,
대소비교를 위해 Integer형 Wrapper Class의 parseInt() method를 이용해
String형으로 되어있는 카드의 숫자를 int형으로 바꿔준다. */
int serverCardNum = Integer.parseInt(CardNum);
/* Server에서 뽑은 카드 출력을 위해,
1 == 'A', 11 == 'J', 12 == 'Q', 13 == 'K'로 변환하기 위한 과정 */
numToChar ntc = new numToChar();
System.out.println("서버의 카드: " + card.get(0) + "," + ntc.numberToChar(CardNum));
// Server가 뽑은 카드 송신
pw.println(card.get(0) + "," + card.get(1))
pw.flush();
// Client측 카드 받아오기
String cardFromClient = br.readLine();
/* Client측에서 송신할때 "카드모양, 카드숫자"형태로 메시지를 송신했으므로,
split method를 통해 분할해서 String배열에 넣어준다. */
String[] clientCard = cardFromClient.split(",");
// 대소 비교를 위한 Client의 카드숫자를 int형으로 저장
int clientCardNum = Integer.parseInt(clientCard[1]);
// Client가 뽑은 카드 Server쪽에서 출력
String clientCardNum2 = ntc.numberToChar(clientCard[1] + "");
System.out.println("나의 카드: " + clientCard[0] + "," + clientCardNum2);
// 대소 비교후 Client에게 결과 송신
if(serverCardNum > clientCardNum) {
// Ace(1인경우)는 반대로 처리
if(clientCardNum == 1) {
String Message = ("당신이 이겼습니다.");
pw.println(Message);
pw.flush();
}else {
String Message = ("당신이 졌습니다.");
pw.println(Message);
pw.flush();
}
}else if(serverCardNum < clientCardNum) {
// Ace(1인경우)는 반대로 처리
if(serverCardNum == 1) {
String Message = ("당신이 졌습니다.");
pw.println(Message);
pw.flush();
}else {
String Message = ("당신이 이겼습니다.");
pw.println(Message);
pw.flush();
}
}else {
String Message = ("비겼습니다.");
pw.println(Message);
pw.flush();
}
br.close();
pw.close();
Client.close();
}
}
}
import java.util.ArrayList;
import java.util.Random;
public class Card {
private String pattern = " ";
// 수업시간에 배운 Outputstream중 PrintWriter이용하기 위해
// 카드의 숫자도 String형으로 선언
private String cardNum = " ";
public ArrayList selectCard() {
// 카드 모양 생성
Random rd = new Random();
int forPattern = rd.nextInt(4) + 1;
switch(forPattern) {
case 1:
pattern = "♠";
break;
case 2:
pattern = "♣";
break;
case 3:
pattern = "♥";
break;
case 4:
pattern = "◆";
}
// 11 = Jack, 12 = Queen, 13 = King
int forNumber = rd.nextInt(13) + 1;
// Server로 메시지를 줄때 PrintWriter Stream이용해야 하니 String으로 바꿔준다.
cardNum = Integer.toString(forNumber);
ArrayList aArr = new ArrayList();
aArr.add(pattern);
aArr.add(cardNum);
return aArr;
}
public String getCardNum() {
return cardNum;
}
}
public class numToChar {
// 카드의 숫자를 받아서 A, J, Q ,K로 변환해주는 class
public String numberToChar(String cardNum) {
switch(cardNum) {
case "1":
cardNum = "A";
return cardNum;
case "11":
cardNum = "J";
return cardNum;
case "12":
cardNum = "Q";
return cardNum;
case "13":
cardNum = "K";
return cardNum;
default:
return cardNum;
}
}
}