Java/네트워크 통신

[Java] 93. 1:1 단방향 통신 (Server 측)

Song hyun 2024. 5. 22. 14:22
728x90
반응형

[Java] 93. 1:1 단방향 통신 (Server 측)

1. 왜 서버 측 기본 코드를 작성할까?

2. 시나리오 코드 작성


1. 네트워크 통신의 기초 이해

 

(1) 네트워크 통신의 기초 이해: 서버는 네트워크 통신의 핵심 역할을 한다. 서버 측 코드를 작성함으로써, 우리는 네트워크 통신의 기본 개념을 이해할 수 있다.

-서버 소켓 생성(ServerSocket): 네트워크 연결을 기다리는 소켓.

-포트 바인딩: 특정 포트 번호에 서버 소켓을 결합하여, 외부에서 접근할 수 있게 한다.

-클라이언트 연결 수락: 클라이언트가 서버에 연결될 수 있게 대기하고, 요청을 받아들인다.

 

 

(2) 데이터 송수신 이해: 서버 측 코드에서 클라이언트로부터 데이터를 수신하고, 이를 처리하는 과정을 배울 수 있다. 이는 네트워크 프로그래밍의 핵심 기능 중 하나이다.

-입력 스트림(InputStream): 클라이언트로부터 데이터를 읽어들이는 방법이다.

-데이터 처리: 수신된 데이터를 처리하고, 출력하는 방법을 배운다.

 

 

(3) 오류 처리 및 디버깅: 서버 측 코드를 작성하면서 발생할 수 있는 다양한 오류를 경험하고, 이를 해결하는 방법을 배울 수 있다.

-예외 처리(Exception handling): 네트워크 통신에서 발생할 수 있는 예외 상황을 처리하는 법을 알 수 있다.

-디버깅(Debugging): 코드의 문제를 파악하고, 수정하는 능력을 키운다.

 


2. 시나리오 코드 작성

 

(1) Client의 연결 요청을 받아들일 ServerSocket 생성, ServerSocket에 포트 번호 5000을 초기화한다.
(2) 포트 번호 5000인 클라이언트가 연결을 요청할 때, 이와 연결할 socket을 serverSocket.accept()를 통해 생성한다.
(3) 받은 데이터를 전달하고, 읽어들이기 위해 InputStream(기반)-BufferedReader(보조) 스트림을 사용한다.
(4) InputStream으로 받아들이고, BufferedReader를 통해 한 줄 단위로 읽어들인 데이터를 String 변수 message에 담아 출력한다.
(5) 마지막으로 serverSocket을 닫아준다.(.close())

package ch02;

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

public class ServerFile {

	public static void main(String[] args) {

		// 준비물
		// 1. 서버 소켓이 필요하다.
		// 2. 포트 번호가 필요하다. (0~65535까지 존재한다.)
		// 2-1. 잘 알려진 포트 번호: 주로 시스템 레벨에서 먼저 선점 중 (0-1023)
		// 2-2. 등록 가능한 포트 번호: 1024-49151
		// 2-3. 동적/사설 포트 번호: 그 외 임시 사용을 위해 할당된다.

		// 지역 변수 -->
		ServerSocket serverSocket = null;
		try {
			serverSocket = new ServerSocket(5001);
			System.out.println(" 서버를 시작합니다. 포트 번호 : 5001 ");
			Socket socket = serverSocket.accept(); // while --> return socket
			// client와 연결된 socket을 return 한다.
			System.out.println(">>> 클라이언트가 연결하였습니다. <<<");

			// 데이터를 전달 받기 위해서는 뭐가 필요하다? --> 스트림!
			InputStream inputStream = socket.getInputStream();
			// 문자 기반 스트림
			BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

			// 실제 데이터를 읽는 행위가 필요하다.
			String message = reader.readLine();
			System.out.println("클라이언트 측 메세지 전달 받음 : " + message);

			socket.close();

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (serverSocket != null) {
				try {
					serverSocket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

}
728x90
반응형