반응형
안녕하세요! 오늘은 Java로 간단한 TCP 소켓 프로그래밍을 배워보겠습니다. TCP 소켓 프로그래밍은 서버와 클라이언트 간에 데이터를 주고받는 기초적인 네트워크 프로그래밍입니다. 이를 배우면 네트워크 통신의 기본 원리를 쉽게 이해할 수 있답니다. 😊
TCP 소켓 프로그래밍이란?
TCP 소켓은 서버와 클라이언트가 연결을 맺고 데이터를 주고받을 수 있도록 도와주는 도구입니다.
- 서버: 클라이언트의 요청을 기다리고 응답을 처리합니다.
- 클라이언트: 서버에 연결 요청을 보내고 데이터를 주고받습니다.
이번 예제에서는 서버와 클라이언트를 구현하고 간단히 통신해보겠습니다.
전체 흐름
- 서버(Server): 연결 요청을 기다리고, 클라이언트가 접속하면 환영 메시지를 출력합니다.
- 클라이언트(Client): 서버에 연결 요청을 보내고, 연결되면 성공 메시지를 출력합니다.
코드 살펴보기
1️⃣ 서버 코드: Server.java
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
ServerSocket serverSocket = null; // 서버 소켓 생성
try {
serverSocket = new ServerSocket(); // 서버 소켓 인스턴스 생성
InetSocketAddress local = new InetSocketAddress("127.0.0.1", 10000); // 서버 IP와 포트 설정
serverSocket.bind(local); // 소켓 바인딩
System.out.println("<서버가 시작되었습니다.>");
System.out.println("[연결을 기다립니다.]");
// 클라이언트 연결 대기
Socket socket = serverSocket.accept(); // 클라이언트 연결 요청 수락
// 클라이언트 접속 정보 출력
InetSocketAddress socketAddress = (InetSocketAddress) socket.getRemoteSocketAddress();
System.out.println("[클라이언트가 연결되었습니다.]");
System.out.println(socketAddress.getAddress() + ":" + socketAddress.getPort());
System.out.println("===============");
System.out.println("<서버 종료>");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
serverSocket.close(); // 서버 소켓 닫기
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
🟢 설명
- ServerSocket: 클라이언트의 요청을 기다리기 위한 소켓입니다.
- bind(): 서버가 사용할 IP와 포트를 지정합니다.
- accept(): 클라이언트의 연결 요청을 수락합니다.
- 클라이언트 정보 출력: 접속한 클라이언트의 IP와 포트를 확인합니다.
2️⃣ 클라이언트 코드: Client.java
import java.io.IOException;
import java.net.ConnectException;
import java.net.InetSocketAddress;
import java.net.Socket;
public class Client {
public static void main(String[] args) {
Socket socket = null; // 클라이언트 소켓 생성
try {
socket = new Socket(); // 소켓 인스턴스 생성
System.out.println("<클라이언트 시작>");
System.out.println("[연결을 요청합니다.]");
InetSocketAddress remote = new InetSocketAddress("127.0.0.1", 10000); // 서버 주소와 포트 설정
socket.connect(remote); // 서버에 연결 시도
System.out.println("[서버에 연결되었습니다.]");
System.out.println("<클라이언트 종료>");
} catch (ConnectException e) {
System.err.println("접속이 거부되었습니다."); // 서버가 실행 중이 아닐 경우
} catch (IOException e) {
e.printStackTrace(); // 예외 발생 시 출력
} finally {
try {
socket.close(); // 소켓 닫기
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
🟢 설명
- Socket: 서버와 연결하기 위한 클라이언트 소켓입니다.
- connect(): 서버와 연결을 시도합니다.
- 연결 성공 메시지 출력: 연결이 성공하면 확인 메시지를 출력합니다.
3️⃣ 추가 예제: Client2.java
Client2.java는 Client.java와 같은 동작을 하지만, 초보자가 이해하기 쉽게 주석을 더 추가했습니다.
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
public class Client2 {
public static void main(String[] args) {
Socket socket = null; // 소켓 생성
try {
socket = new Socket(); // 새로운 소켓 객체 생성
System.out.println("<클라이언트가 시작되었습니다.>");
System.out.println("[서버 연결을 시도합니다.]");
InetSocketAddress remote = new InetSocketAddress("127.0.0.1", 10000); // 서버 주소와 포트 설정
socket.connect(remote); // 서버 연결
System.out.println("[서버와 연결되었습니다.]");
System.out.println("<클라이언트 종료>");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close(); // 소켓 닫기
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
실행 방법
1️⃣ 서버 실행
- 먼저 Server.java를 실행하세요.
- 서버가 시작되고 클라이언트의 연결 요청을 기다립니다:
<서버가 시작되었습니다.> [연결을 기다립니다.]
2️⃣ 클라이언트 실행
- 다음으로 Client.java 또는 Client2.java를 실행하세요.
- 클라이언트가 서버에 연결 요청을 보냅니다:
<클라이언트 시작> [연결을 요청합니다.] [서버에 연결되었습니다.] <클라이언트 종료>
3️⃣ 서버 로그 확인
클라이언트가 연결되면 서버에서 다음과 같은 로그를 확인할 수 있습니다:
[클라이언트가 연결되었습니다.]
127.0.0.1:50000
===============
<서버 종료>
실행 결과 요약
- 서버는 클라이언트의 요청을 기다리고, 연결이 되면 클라이언트 정보를 출력합니다.
- 클라이언트는 서버에 연결 성공 여부를 출력하고 종료합니다.
마무리
이번 글에서는 Java로 간단한 TCP 소켓 프로그래밍을 구현해 보았습니다.
이 코드는 네트워크 프로그래밍의 기초로, 이후 데이터 전송, 멀티스레드 서버 등으로 확장할 수 있는 중요한 기반이 됩니다.
직접 코드를 실행해 보면서 네트워크 통신의 원리를 익혀 보세요! 😊

반응형
'개발 > JAVA' 카테고리의 다른 글
Java에서 상속과 업캐스팅/다운캐스팅 배우기 (3) | 2025.01.29 |
---|---|
Java로 네트워크 프로그래밍 시작하기: InetAddress를 활용한 IP 주소 확인 (4) | 2025.01.28 |
쉽게 배우는 Java 에코 서버와 클라이언트 만들기! (8) | 2025.01.24 |
JDBC와 오라클 데이터베이스: 자바로 간단한 작가 관리 애플리케이션 만들기 (4) | 2025.01.23 |
Java 입출력과 텍스트 처리: Scanner와 StringTokenizer 활용하기 (18) | 2025.01.22 |