[ 문제 ]

서버에 요청해 카드를 뽑아 비교해 봅시다. 서버로부터 제공 받는 정보는 카드의 문양(♠,♣,♥,◆)의 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;
		}
	}
}

카드놀이.png

ACE.png