mojo's Blog

수식 계산 Server-Client 만들기 본문

Java

수식 계산 Server-Client 만들기

_mojo_ 2021. 8. 23. 15:35

클라이언트가 수식을 보내면 서버가 수식을 계산한 후에 답을 전송하는 통신 프로그램을 만들어 본다.

프로그램의 동작 방법은 다음과 같다.

 

  • 서버 클라이언트는 1:1로 통신한다.
  • 서버를 먼저 실행시키고 클라이언트를 실행시켜 서버에 접속한다.
  • 클라이언트는 사용자로부터 수식을 입력받아 서버로 전송한다. 연산자는 +, -, * 3가지만 허용하고 정수 연산만 가능하다.
  • 서버가 식을 받으면 식을 서버의 화면에 출력하고, 계산하여 결과를 클라이언트로 보낸다.
  • 클라이언트는 서버로부터 받은 답을 화면에 출력한다.
  • 클라이언트와 서버는 전송할 데이터를 문자열로 만들고 "\n" 을 덧붙여 전송하며, 받는 쪽에서는 라인 단위로 수신한다.
  • 클라이언트가 "bye" 를 보내면 양쪽 모두 종료한다.

 

Server Code

 

package Part15;

import java.io.*;
import java.util.*;
import java.net.*;

public class ServerEx {

	public static String calc(String exp) {
		StringTokenizer st = new StringTokenizer(exp, " ");
		if(st.countTokens() != 3) return "error";
		
		String res = "";
		int op1 = Integer.parseInt(st.nextToken());
		String opcode = st.nextToken();
		int op2 = Integer.parseInt(st.nextToken());
		switch(opcode){
			case "+": res = Integer.toString(op1 + op2);
				break;
			case "-": res = Integer.toString(op1 - op2);
				break;
			case "*": res = Integer.toString(op1 * op2);
				break;
			default : res = "error";
		}

		return res;
	}
	
	public static void main(String[] args) {
		BufferedReader in = null;
		BufferedWriter out = null;
		ServerSocket listener = null;
		Socket socket = null;
		Scanner scanner = new Scanner(System.in);
		
		try {
			listener = new ServerSocket(9999);
			System.out.println("연결들 기다리고 있습니다......");
			socket = listener.accept();
			System.out.println("연결되었습니다.");
			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
			while(true) {
				String inputMessage = in.readLine();
				if(inputMessage.equalsIgnoreCase("bye")) {
					System.out.println("Client 에서 bye로 연결을 종료하였음");
					break;
				}
				System.out.println("클라이언트 : "+inputMessage);
				String outputMessage = calc(inputMessage);
				out.write(outputMessage+"\n");
				out.flush();
			}
		} catch(IOException e) {
			System.out.println(e.getMessage());
		}
		finally {
			try {
				scanner.close();
				socket.close();
				listener.close();
			} catch(IOException e) {
				System.out.println("클라이언트와 채팅 중 오류가 발생했습니다.");
			}
		}
	}
	
}

 

Client Code

 

package Part15;

import java.io.*;
import java.util.*;
import java.net.*;

public class ClientEx {

	public static void main(String[] args) {
		BufferedReader in = null;
		BufferedWriter out = null;
		Socket socket = null;
		Scanner scanner = new Scanner(System.in);
		
		try {
			socket = new Socket("localhost", 9999);
			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
			while(true) {
				System.out.print("보내기 >> ");
				String outputMessage = scanner.nextLine();
				if(outputMessage.equalsIgnoreCase("bye")) {
					out.write(outputMessage+"\n");
					out.flush();
					break;
				}
				out.write(outputMessage+"\n");
				out.flush();
				String inputMessage = in.readLine();
				System.out.println("서버 : "+inputMessage);
			}
		} catch(IOException e) {
			System.out.println(e.getMessage());
		}
		finally {
			try {
				scanner.close();
				if(socket != null) socket.close();
			} catch(IOException e) {
				System.out.println("클라이언트와 채팅 중 오류가 발생했습니다.");
			}
		}
	}
	
}

Comments