본문 바로가기

Java

1:1 단방향 통신 (서버측)

서버  측 기본 코드 작성의 목적

네트워크 프로그래밍을 시작하면서 가장 먼저 배워야 할 것은 서버와 클라이언트 간의 통신이다. 서버는 클라이언트의 요청을 받아들이고, 클라이언트가 보내는 데어티를 처리하는 역할을 한다.

 

서버 측 코드를 작성 해보는 이유는?

네트워크 통신의 기초 이해

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

 

  • 서버 소켓 (ServerSocket) 생성 : 네트워크 역할을 기다리는 소킷이다.
  • 포트 바인딩 : 특정 포트 번호에 서버 소켓을 결합하여 외부에서 접근할 수 있도록 한다.
  • 클라이언트 연결 수락 : 클라이언트가 서버에 연결할 수 있도록 대기하고, 연결 요청을 받아들인다. 

 

데이터 송수신 이해

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

  • 입력 스트림 (InputStream) : 클라이언트로부터 데이터를 읽어 들이는 방법이다.
  • 데이터 처리 : 수신된 데이터를 처리하고 출력하는 방법을 배운다.

 

오류 처리 및 디버깅

서버 측 코드를 작성하면서 발생할 수 있는 당양한 오류를 경험하고, 이를 해결하는 방법을 배우게 된다.

  • 예외처리 (Exception Handling) : 네트워크 통신에서 발생할 수 있는 예외 상황을 처리하는 방법을 배운다.
  • 디버깅 (Debugging) : 코드의 문제를 파악하고 수정하는 능력을 키운다.

 

시나리오 코드 1 - 서버측 프로그램 만들기

프로젝트를 별도생성해서 작업을 하자.

package ch01;

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

public class Server {

	public static void main(String[] args) {

		// 서버측 소켓 통신을 만들기 위한 준비물
		// 1. ServerSocket (클라이언트 측 소켓과 연결과 시켜줌)
		// 2. 클라이언트와 연결 되는 소켓을 들고 있어야 한다.

		// 로컬 컴퓨터에는 정해진, 사용할 수 있는 포트 번호 갯수가
		// 할당되어 있다. 1 ~ 1024 포트 번호는 잘 알려진 포트 번호
		// 시스템이 선점하고 있는 번호들이다.
		try (
				ServerSocket serverSocket = new ServerSocket(5000)) {
			System.out.println("서버 포트 번호 : 5000 으로 생성");
			
			// 내부 메서드 안에서 while 문을 돌면서 클라이언트 측에
			// 연결을 기다리고 있다.
			Socket socket = serverSocket.accept();
			
			// 여기 아래는 클라이언트 측과 양 끝단에 소켓이 서로
			// 연결되어야 실행 흐름이 내려온다.
			System.out.println("Client connected...");
			
			// 대상 - 소켓 -> 입력 스트림을 가져온다.
			InputStream input = socket.getInputStream();
			BufferedReader reader = new BufferedReader(new InputStreamReader(input));
			String message = reader.readLine(); // 한줄 단위로 데이터를 읽는다 (문자 기반)
			System.out.println("Received" + message);
			
			// 기본 소켓은 클라이언트가 연결되어야 생성된다.
			socket.close();
			
		} catch (Exception e) {
			e.printStackTrace();
		}

	}// end of main

}// end of class

 

 


 

 

포트 번호의 개수

일반 컴퓨터에서는 포트 번호의 범위가 0부터 65535까지 존재한다. 이는 총 65,536개의 포트 번호를 의미한다. 이 포트 번호들은 여러 가지 목적에 따라 다음과 같이 구분된다.

  • 잘 알려진 포트 번호(Well-known Ports) : 0부터 1023까지 (주로 시스템 레벨의 서비스에 사용)
  • 등록된 포트 번호(Registered Ports) : 1024부터 49151까지 (특정 애플리케이션이나 사용자 프로세스에 사용)
  • 동적/사설 포트 번호(Dynamic/Private Ports) : 49152부터 65535까지 (임시 사용을 위해 동적으로 할당)

 

잘 알려진 포트 번호(Well-known Ports)

잘 알려진 포트 번호는 IANA(Internet Assigned Numbers Authority)에서 할당하고 관리하며, 주로 표준화된 인터넷 서비스에 사용됩니다. 몇 가지 주요 포트 번호와 그 사용 용도는 다음과 같습니다:

  • 포트 20, 21: FTP(File Transfer Protocol)
    • 포트 20: 데이터 전송용
    • 포트 21: 제어 명령용
  • 포트 22: SSH(Secure Shell)
    • 원격 로그인 및 다른 네트워크 서비스를 위한 암호화된 통신
  • 포트 23: Telnet
    • 원격 로그인 서비스 (보안성이 떨어져 현재는 거의 사용되지 않음)
  • 포트 25: SMTP(Simple Mail Transfer Protocol)
    • 이메일 전송
  • 포트 53: DNS(Domain Name System)
    • 도메인 이름을 IP 주소로 변환
  • 포트 80: HTTP(Hypertext Transfer Protocol)
    • 웹 브라우징
  • 포트 110: POP3(Post Office Protocol version 3)
    • 이메일 수신
  • 포트 143: IMAP(Internet Message Access Protocol)
    • 이메일 수신 및 관리
  • 포트 443: HTTPS(HTTP Secure)
    • 보안 웹 브라우징 (SSL/TLS 사용)
  • 포트 3389: RDP(Remote Desktop Protocol)
    • 원격 데스크톱 접속

 

포트 번호의 사용 예

각 포트 번호는 특정 네트워크 서비스를 나타내며, 서버가 특정 서비스에 대해 대기하고 있는 포트 번호를 사용하여 클라이언트와 통신한다. 예를 들어, 웹 서버는 일반적으로 포트 80(HTTP) 또는 포트 443(HTTPS)을 사용하여 클라이언트의 요청을 대기한다. 이메일 서버는 포트 25(SMTP), 110(POP3), 또는 143(IMAP) 등을 사용하여 이메일 송수신 요청을 처리한다.

 

포트 번호의 할당

  • 운영체제와 네트워크 애플리케이션 : 운영체제는 포트 번호를 네트워크 애플리케이션에 할당하여 통신이 원활히 이루어지도록 한다. 예를 들어, 웹 브라우저가 웹 서버에 연결할 때 임시로 할당된 동적 포트를 사용하여 통신한다.
  • 포트 포워딩: 라우터에서 특정 포트 번호를 내부 네트워크의 특정 장치로 전달하여 외부에서 내부 네트워크의 서비스에 접근할 수 있게 한다.

 

요약

일반 컴퓨터에서는 총 65,536개의 포트 번호가 있으며, 이들은 잘 알려진 포트 번호, 등록된 포트 번호, 동적/사설 포트 번호로 구분된다. 잘 알려진 포트 번호는 표준화된 인터넷 서비스에 사용되며, 각 포트 번호는 특정 네트워크 서비스를 나타낸다. 이를 통해 네트워크 애플리케이션은 서로 간의 통신을 원활하게 할 수 있다.

728x90

'Java' 카테고리의 다른 글

1:1 양방향 통신 (채팅 기본 기능 구현)  (0) 2024.05.24
1 : 1 양방향 통신  (0) 2024.05.24
Socket (소켓)  (0) 2024.05.24
고수준 스트림 ( Data / Object Stream )  (0) 2024.05.24
사용자 모드와 커널 모드  (0) 2024.05.24