Java는 강력한 네트워크 프로그래밍 기능을 제공하며, 소켓(Socket)을 활용하면 서버와 클라이언트 간의 통신을 쉽게 구현할 수 있습니다. 이번 글에서는 소켓을 이용하여 기본적인 서버와 클라이언트 프로그램을 구현하는 방법을 단계별로 살펴보겠습니다.
1. 소켓(Socket)이란?
소켓은 네트워크 상에서 데이터를 송수신하기 위한 양쪽 끝단을 의미합니다.
TCP 소켓: 신뢰성이 높은 연결 기반 통신. UDP 소켓: 빠르고 가벼운 비연결 기반 통신.
2. 서버 프로그램 구현하기
다음은 Java에서 TCP 기반의 서버를 구현한 예제입니다.
import java.io.*;
import java.net.*;
public class ServerExample {
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(12345)) {
System.out.println("서버가 12345 포트에서 대기 중입니다...");
// 클라이언트 연결 대기
Socket clientSocket = serverSocket.accept();
System.out.println("클라이언트가 연결되었습니다: " + clientSocket.getInetAddress());
// 데이터 송수신
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String message = in.readLine();
System.out.println("클라이언트로부터 받은 메시지: " + message);
out.println("서버에서 답변: " + message.toUpperCase());
} catch (IOException e) {
System.out.println("서버 오류: " + e.getMessage());
}
}
}
설명:
ServerSocket
객체 생성: 특정 포트(12345)에서 연결 대기.accept()
메서드: 클라이언트 연결을 수락.BufferedReader
와 PrintWriter
: 클라이언트와 데이터 송수신.3. 클라이언트 프로그램 구현하기
클라이언트는 서버에 연결하고 데이터를 주고받습니다.
import java.io.*;
import java.net.*;
public class ClientExample {
public static void main(String[] args) {
try (Socket socket = new Socket("localhost", 12345)) {
System.out.println("서버에 연결되었습니다.");
// 데이터 송수신
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("안녕하세요, 서버!");
String response = in.readLine();
System.out.println("서버로부터 받은 메시지: " + response);
} catch (IOException e) {
System.out.println("클라이언트 오류: " + e.getMessage());
}
}
}
설명
Socket
객체 생성: 서버에 연결 요청.BufferedReader
와 PrintWriter
: 서버와 데이터 송수신.4. 실행 순서
예시 출력
서버가 12345 포트에서 대기 중입니다...
클라이언트가 연결되었습니다: /127.0.0.1
클라이언트로부터 받은 메시지: 안녕하세요, 서버!
서버에 연결되었습니다.
서버로부터 받은 메시지: 안녕하세요, 서버!
5. 네트워크 프로그래밍 시 주의사항
멀티스레드 예제
class ClientHandler extends Thread {
private Socket clientSocket;
public ClientHandler(Socket socket) {
this.clientSocket = socket;
}
@Override
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String message = in.readLine();
out.println("서버에서 답변: " + message.toUpperCase());
} catch (IOException e) {
System.out.println("클라이언트 처리 중 오류: " + e.getMessage());
}
}
}
결론
자바에서 네트워크 프로그래밍의 Socket을 이용한 서버와 클라이언트 구현에 대해 알아 보았습니다. Java의 소켓 프로그래밍은 네트워크 통신을 구현하는 데 매우 유용한 도구입니다. 서버와 클라이언트 간의 기본 통신에서 멀티스레드와 같은 고급 기능으로 확장할 수 있습니다.
다음 블로그에서는 Java에서의 데이터베이스 연결 중 JDBC를 이용한 SQL 쿼리 실행에 대해 알아 보겠습니다. 감사합니다.
디딤돌 전세 대출을 받은 실제 경험 바탕으로 포스팅을 작성합니다. 디딤돌 대출은 생애최초, 신혼부부 대출로 나뉘어져…
현대 웹 애플리케이션에서는 보안이 중요한 요소이며, Spring Security는 강력한 인증 및 권한 관리 기능을 제공합니다.…
애플리케이션 개발에서 로깅(logging)과 모니터링(monitoring)은 필수적인 요소입니다. Java 애플리케이션이 실행되는 동안 발생하는 이벤트를 기록하고, 성능 및…
API(Application Programming Interface)는 애플리케이션 간 데이터를 주고받기 위한 인터페이스로, Java에서는 주로 RESTful API와 GraphQL API를…
디자인 패턴(Design Patterns)은 소프트웨어 개발에서 자주 발생하는 문제를 해결하기 위한 일반적인 해결책을 제공합니다. 특히, GoF(Gang…
Java의 애너테이션(Annotation)은 메타데이터를 코드에 추가하는 기능을 제공합니다. 이를 활용하면 코드의 가독성을 높이고, 프레임워크에서 런타임 처리를…