서버 측 기본 코드 작성의 목적
네트워크 프로그래밍을 시작하면서 가장 먼저 배워야 할 것은 서버와 클라이언트 간의 통신이다. 서버는 클라이언트의 요청을 받아들이고, 클라이언트가 보내는 데어티를 처리하는 역할을 한다.
서버 측 코드를 작성 해보는 이유는?
네트워크 통신의 기초 이해
서버는 네트워크 통신의 핵심 역할을 한다. 서버 측 코드를 작성함으로써 우리는 네트워크 통신의 기본 개념을 이해할 수 있다.
- 서버 소켓 (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개의 포트 번호가 있으며, 이들은 잘 알려진 포트 번호, 등록된 포트 번호, 동적/사설 포트 번호로 구분된다. 잘 알려진 포트 번호는 표준화된 인터넷 서비스에 사용되며, 각 포트 번호는 특정 네트워크 서비스를 나타낸다. 이를 통해 네트워크 애플리케이션은 서로 간의 통신을 원활하게 할 수 있다.
'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 |