학습
Java 네트워크 프로그래밍 기초
Java 네트워크 프로그래밍 기초 — 중급
네트워크 프로그래밍 기초
1. 도입 (왜 배워야 하는가)
네트워크 프로그래밍은 현대 소프트웨어 개발에서 필수적인 기술입니다. 웹 애플리케이션, 모바일 앱, IoT 기기 등 다양한 분야에서 데이터의 전송 및 통신이 필요하기 때문입니다. 예를 들어, 온라인 쇼핑몰을 운영하는 경우 사용자가 장바구니에 상품을 추가할 때 서버와 클라이언트 간의 데이터 통신이 필요합니다.
이러한 네트워크 통신을 이해하지 못하면 데이터 전송의 효율성 저하, 보안 문제, 사용자 경험 저하 등의 문제가 발생할 수 있습니다. 따라서, 네트워크 프로그래밍의 기초를 이해하는 것은 실무에서 매우 중요합니다.
2. 핵심 개념 설명
2.1. 소켓(Socket)
소켓은 네트워크에서 통신을 수행하기 위한 한 쌍의 끝점입니다. 서버와 클라이언트 간의 데이터 전송을 가능하게 해줍니다. 비유하자면, 소켓은 전화기의 수화기와 같습니다. 수화기를 통해 음성(데이터)을 주고받을 수 있습니다.
2.2. IP 주소
IP 주소는 네트워크에 연결된 장치의 고유한 주소입니다. 집 주소와 같은 역할을 하며, 데이터를 올바른 장소로 보내는 데 사용됩니다.
2.3. 포트(Port)
포트는 IP 주소 내에서 특정 애플리케이션을 식별하는 번호입니다. 집 주소에 있는 방 번호와 비슷해서, 같은 집에서 여러 방(서비스)을 구분할 수 있습니다.
| 용어 | 설명 |
|---|---|
| 소켓 | 네트워크 통신을 위한 끝점 |
| IP 주소 | 네트워크 장치의 고유 주소 |
| 포트 | 애플리케이션을 식별하는 번호 |
3. 기본 코드 예제
아래는 자바를 이용한 간단한 TCP 서버와 클라이언트의 예제입니다.
서버 코드
import java.io.;
import java.net.;
public class SimpleServer {
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(12345)) {
System.out.println("서버가 시작되었습니다.");
Socket clientSocket = serverSocket.accept();
System.out.println("클라이언트가 연결되었습니다.");
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
out.println("안녕하세요, 클라이언트!");
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
클라이언트 코드
import java.io.;
import java.net.;
public class SimpleClient {
public static void main(String[] args) {
try (Socket socket = new Socket("localhost", 12345)) {
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String response = in.readLine();
System.out.println("서버로부터의 응답: " + response);
} catch (IOException e) {
e.printStackTrace();
}
}
}
실행 결과
서버가 시작되었습니다.
클라이언트가 연결되었습니다.
서버로부터의 응답: 안녕하세요, 클라이언트!
코드 한 줄씩 동작 설명
ServerSocket serverSocket = new ServerSocket(12345);: 포트 12345에서 서버 소켓을 생성합니다.Socket clientSocket = serverSocket.accept();: 클라이언트의 연결을 기다립니다.PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);: 클라이언트에게 데이터를 보낼 준비를 합니다.out.println("안녕하세요, 클라이언트!");: 클라이언트에게 메시지를 전송합니다.- 클라이언트는 서버에 연결하고, 메시지를 받아 출력합니다.
- 잘못된 코드:
4. 실전 활용 예제
4.1. 온라인 게임 서버
온라인 게임에서 클라이언트는 서버와 지속적으로 통신하여 플레이어의 상태, 점수, 채팅 등을 실시간으로 업데이트합니다. 이 경우, 소켓은 게임 데이터의 전송을 담당합니다.
4.2. 실시간 채팅 애플리케이션
채팅 애플리케이션에서 사용자는 메시지를 서로 주고받기 위해 소켓을 사용하여 서버와 클라이언트 간의 연결을 유지해야 합니다. 서버는 메시지를 여러 클라이언트에 전달하는 중간 역할을 합니다.
4.3. 웹 API 통신
웹 애플리케이션에서 RESTful API를 통해 다른 서비스와 데이터를 주고받는 경우에도 네트워크 프로그래밍이 필요합니다. 클라이언트는 API 서버에 요청을 보내고, 서버는 응답을 반환합니다.
5. 흔한 실수와 주의사항
실수 1: 포트 번호 충돌
서버가 이미 사용 중인 포트 번호를 사용하려고 하면 오류가 발생합니다.
ServerSocket serverSocket = new ServerSocket(80); // 이미 사용 중인 포트
ServerSocket serverSocket = new ServerSocket(12345); // 사용 가능한 포트
실수 2: 예외 처리 미비
네트워크 프로그래밍에서 예외 처리를 소홀히 하면 프로그램이 비정상적으로 종료될 수 있습니다.
Socket socket = new Socket("localhost", 12345); // 예외 처리 없음
try {
Socket socket = new Socket("localhost", 12345);
} catch (IOException e) {
e.printStackTrace(); // 예외 처리 추가
}
6. 정리
다음에 학습하면 좋은 주제는 UDP 소켓 프로그래밍, 웹 소켓, RESTful API 설계입니다. 이를 통해 더 다양한 네트워크 프로그래밍 기법을 익힐 수 있습니다.