본문 바로가기
JAVA SE/Code

CODE REVIEW [20.08.05/Day_20] Java SE / Network 네트워크 | 메아리 서버/클라이언트 구현 복습

by 파프리카_ 2020. 8. 5.
728x90
반응형

[ Review 복습 ]

  서버 클라이언트
  ServerSocket(port)
→ 대표 전화 역할
 
  try 영역 try 영역
  ServerSocket.accept()
→  대기 상태

Socket socket = ServerSocket.accept();
→ 직원 전화 역할
→ Socket이 만들어지면(클라이언트 연결되면) 동작(연결)
→ 클라이언트가 여러 명일 경우 accept() 여러 개
→ 한사람과 통화할 경우 (input, output반복) accept() 한 개

socket = new Socket(serverIp, port)
→ 고객 전화기 역할
→ 소캣이 정상적으로 생성됐다는 것은 서버와 접속됨을 의미
→ server에 accept가 실행되며,
서버 socket(직원 전화기)이 만들어짐

scanner = new Scanner(System.in)
콘솔창에 입력받기 위한 객체
  br= new BufferedReader(new InputStreamReader(socket.getInputStream()))
→ getInputStream : 클라이언트 정보 받아오기
→ InputStreamReader : 16비트로 전환

→ BufferedReader : 자바 오브젝트로 읽어오기
(직원전화 수화기 - 듣기(입력))
pw = new PrintWriter (socket.getOutputStream(), true) 
→ pw = 서버에 출력
→ socket.getOutputStream() : 말하는 역할


  pw = new PrintWriter(socket.getOutputStream(), true)
→ socket.getOutputStream : 서버 정보 출력- 노트스트림
→ true:  auto flush  < 그때 그때 출력

→ PrintWriter: 서버 정보 출력- 프로세싱 스트림
(직원전화 송화기 - 말하기(출력))

br = new BufferedReader(new InputStreamReader(socket.getInputStream()))
→  br = 서버로부터 입력받음
→ socket.getInputStream() : 듣는 역할
  while (true)  → 서버-클라이언트 즉시 출력, 입력됨 (반복)

br. readLine();
→ 입력 받은 메세지 한 줄씩 읽기
pw.println();
→ 클라이언트에 정보 전달 (autoflush이므로 바로 출력)


* if (message == null | message.equals("null") | message.trim().equals("종료")
{ break; }
→ null 혹은 "종료" 입력받으면 while문 종료
→ String.trim() : 양 옆 공백 제거 기능 메서드
while (true)  → 서버-클라이언트 즉시 출력, 입력됨 (반복)

String message = scanner.nextLine();
→ 콘솔에서 서버에 보낼 메세지 입력
pw.println(message);
→ 서버에 정보 전달 (메세지 보내기, 출력)
br.readLine();
→ 서버에서 받은 메세지 (입력) 읽기

* if (message == null | message.equals("null") | message.trim().equals("종료")
{ break; }
→ while 종료
  finally 영역 finally 영역
  if ( socket != null)
  socket.close();
if (serverSocket != null)
  serverSocket.close();
→ 생성 역순으로 닫아준다.
→ socket에 pw와 br이 걸려있기 때문에, socket을 닫으면 둘 다 닫힌다.

if (  scanner != null)
  scanner.close();
if (socket != null)
  socket .close();
→ 생성 역순으로 닫아준다.


 


Server code

/TestServer.java

package review;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/*
 * step 3: 메아리 서버 복습
 */
public class TestServer {
	private void go() throws IOException {
		ServerSocket serverSocket = null; //대표전화
		Socket socket = null; //직원 전화
		BufferedReader br = null;  //직원전화 수화기 - 입력
		PrintWriter pw = null; //직원전화 송화기 - 출력
		
		try {
			// 직원전화 생성 : 서버 실행 중
			serverSocket = new ServerSocket(5432);
			System.out.println("서버 실행 - 클라이언트 접속 대기");
			
			// 클라이언트가 접속하면(클라이언트 소캣 생성되면)
			// 직원전화(일반 Socket) 대기상태에서 -> socket(클라이언트)연결 
			// (accept() 리턴)
			socket = serverSocket.accept();
			System.out.println(socket.getInetAddress()+ " 님 접속했습니다");
			
			// 클라이언트로부터 정보 받기
			br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			pw = new PrintWriter(socket.getOutputStream(), true);
			
			// 서버-클라이언트 송수신 블럭
			while(true)
			{
				// Client에서 입력 받은 메세지 읽기
				String message = br.readLine();
				
				if (message == null | message.equals("null") |
						message.trim().equals("종료"))
				{
					System.out.println("**서버를 종료합니다**");
					break;
				}
				// 콘솔창에 받은 메세지 보여주기
				System.out.println("Client로부터 입력받은 메세지 :" + message);
				
				// Client에 메세지 바로바로 보내기
				pw.println(message + "*server*");
			}
			
		} finally {
			if (socket != null)
				socket.close();
			if (serverSocket != null)
				serverSocket.close();
		}
	}
	
	
	public static void main(String[] args) {
		try {
			new TestServer().go();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	
}

 


Client code

 

/TestCode.java

package review;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

import common.IP;

public class TestClient {

	private void go() throws UnknownHostException, IOException {
		Socket socket = null; // 클라이언트 전화기
		Scanner scanner = null; // 콘솔에서 입력받는 객체
		PrintWriter pw = null; // 서버에 출력할 스트림
		BufferedReader br = null; // 서버에서 입력받을 스트림

		try {
			socket = new Socket(IP.LOCAL, 5432); // 소켓이 정상적으로 생성되면 서버와 접속
			System.out.println("클라이언트가 서버에 접속");

			// 콘솔창에 입력받기 위한 객체
			scanner = new Scanner(System.in);

			// 서버에 출력
			pw = new PrintWriter(socket.getOutputStream(), true);

			// 서버에 입력
			br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

			// 콘솔에서 입력받아 서버에 출력하고 서버에서 입력받아 콘솔에 출력
			while (true) 
			{
				System.out.print("서버에 보낼 메세지:");
				
				//콘솔에서 서버에 보낼 메세지 입력
				String message = scanner.nextLine(); 
				
				pw.println(message); //서버에 메세지 보내기(출력)
				
				if (message == null | message.equals("null") | 
						message.trim().equals("종료"))
				{
					System.out.println("**클라이언트를 종료합니다**");
					break;
				}
				
				// 서버에서 받은 메세지 (입력) 읽기
				System.out.println("서버에서 받은 메세지: "+br.readLine());
			}
			
		} finally {
			if (scanner != null)
				scanner.close();
			if (socket != null)
				socket.close();
		}
	}

	public static void main(String[] args) {
		try {
			new TestClient().go();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

Server Console 결과 

 

Client Console 결과 

728x90
반응형