자바 - 소켓 클래스와 예제

안녕하세요, 자바 프로그래밍에 도전하는 여러분! 오늘 우리는 자바의 소켓 클래스를 사용한 네트워크 프로그래밍의 세계로 흥미로운 여정을 시작할 것입니다. 여러분의 친절한 이웃 컴퓨터 과학 교사로서, 이 모험을 안내해 드리는 것을 기쁘게 생각합니다. 프로그래밍에 처음 도전하는 분이라면 걱정하지 마세요 - 우리는 기본부터 시작해 점진적으로 학습할 것입니다. 그러니 가상의 헬멧을 쓰고, 함께 뛰어들어 보세요!

Java - Socket Class

소켓이란?

코드로 들어가기 전에, 소켓이 무엇인지 이해해 보겠습니다. 친구에게 전화를 걸려고 할 때, 두 가지가 필요합니다: 친구의 전화번호와 전화기. 컴퓨터 네트워킹에서 소켓은 그 전화기와 같은 역할을 합니다 - 두 개의 프로그램 간의 이원 통신 링크의 종단점입니다.

자바 소켓 클래스

자바의 소켓 클래스는 클라이언트 측 소켓을 나타냅니다. 이 클래스는 java.net 패키지의 일부로, 프로그램이 네트워크를 통해 다른 프로그램과 소통할 수 있는 방법을 제공합니다.

선언

소켓 클래스를 사용하려면 먼저 임포트해야 합니다:

import java.net.Socket;

생성자

소켓 클래스는 여러 가지 생성자를 가지고 있습니다. 가장 흔히 사용되는 것들 중 몇 가지를 소개합니다:

생성자 설명
Socket() 연결되지 않은 소켓을 생성합니다
Socket(String host, int port) 소켓을 생성하고 지정된 호스트와 포트에 연결합니다
Socket(InetAddress address, int port) 소켓을 생성하고 지정된 IP 주소와 포트에 연결합니다

메서드

소켓 클래스는 연결 관리와 데이터 전송을 위한 다양한 메서드를 제공합니다. 중요한 몇 가지를 소개합니다:

메서드 설명
connect(SocketAddress endpoint) 이 소켓을 서버에 연결합니다
getInputStream() 이 소켓에서 바이트를 읽기 위한 입력 스트림을 반환합니다
getOutputStream() 이 소켓으로 바이트를 쓰기 위한 출력 스트림을 반환합니다
close() 이 소켓을 닫습니다
isClosed() 소켓이 닫혔는지 여부를 반환합니다
isConnected() 소켓이 연결되었는지 여부를 반환합니다

소켓 클라이언트 예제

이제 서버에 연결하고 메시지를 보내는 간단한 클라이언트를 만들어 보겠습니다. 지금 이해가 되지 않더라도 걱정하지 마세요 - 우리는 단계별로 설명하겠습니다.

import java.io.*;
import java.net.*;

public class SimpleSocketClient {
public static void main(String[] args) {
try {
// 소켓을 생성하고 서버에 연결합니다
Socket socket = new Socket("localhost", 12345);
System.out.println("서버에 연결되었습니다!");

// 서버로 데이터를 보내기 위한 출력 스트림을 생성합니다
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

// 서버에 메시지를 보냅니다
out.println("안녕하세요, 서버! 클라이언트에서 보내는 메시지입니다.");

// 서버로부터 데이터를 받기 위한 입력 스트림을 생성합니다
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

// 서버의 응답을 읽습니다
String response = in.readLine();
System.out.println("서버가 말합니다: " + response);

// 연결을 닫습니다
in.close();
out.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

이 코드를 단계별로 설명하겠습니다:

  1. 필요한 클래스를 임포트합니다.
  2. main 메서드 내에서 예외 처리를 위해 try-catch 블록을 사용합니다.
  3. 새로운 Socket 객체를 생성하고 지정된 서버 주소("localhost"는 동일한 기계를 의미)와 포트 번호(12345)에 연결합니다.
  4. 서버로 데이터를 보내기 위한 PrintWriter를 생성합니다.
  5. 서버에 메시지를 보냅니다.
  6. 서버로부터 데이터를 받기 위한 BufferedReader를 생성합니다.
  7. 서버의 응답을 읽고 출력합니다.
  8. 모든 스트림과 소켓을 닫아 자원을 해제합니다.

이제 서버 코드를 만들어 보겠습니다. 클라이언트가 작동하기 위해서는 동일한 포트에서 리스닝 중인 서버가 필요합니다.

import java.io.*;
import java.net.*;

public class SimpleSocketServer {
public static void main(String[] args) {
try {
// 서버 소켓을 생성합니다
ServerSocket serverSocket = new ServerSocket(12345);
System.out.println("서버는 클라이언트를 기다리고 있습니다...");

// 클라이언트가 연결될 때까지 기다립니다
Socket clientSocket = serverSocket.accept();
System.out.println("클라이언트가 연결되었습니다!");

// 클라이언트로부터 데이터를 받기 위한 입력 스트림을 생성합니다
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("메시지를 받았습니다, 감사합니다!");

// 연결을 닫습니다
in.close();
out.close();
clientSocket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

이 서버 코드는 다음과 같은 작업을 수행합니다:

  1. 포트 12345에서 서버 소켓을 생성합니다.
  2. 클라이언트가 연결될 때까지 기다립니다.
  3. 클라이언트로부터 데이터를 받기 위한 입력 스트림을 생성합니다.
  4. 클라이언트로 데이터를 보내기 위한 출력 스트림을 생성합니다.
  5. 클라이언트의 메시지를 읽고 출력합니다.
  6. 클라이언트에 응답을 보냅니다.
  7. 모든 연결을 닫습니다.

이 예제를 실행하려면 다음과 같이 합니다:

  1. 먼저 SimpleSocketServer 클래스를 실행합니다.
  2. 그런 다음 SimpleSocketClient 클래스를 실행합니다.

이렇게 하면 클라이언트가 서버에 연결하고 메시지를 보내고, 서버가 응답을 보내는 것을 볼 수 있습니다!

결론

축하합니다! 여러분은 자바 소켓을 사용한 첫 번째 클라이언트-서버 애플리케이션을 만들었습니다. 이 것은 네트워크 프로그래밍의 표면에 불과하지만, 아주 좋은 시작입니다.

기억하시길, 소켓은 전화처럼 - 프로그램이 네트워크를 통해 서로 소통할 수 있게 합니다. 이 지식을 바탕으로, 채팅 프로그램, 멀티플레이어 게임, 분산 시스템과 같은 더 복잡한 네트워크 애플리케이션을 만들 수 있습니다.

자바 여정을 계속하면서, ServerSocket, URL, URLConnection과 같은 다른 네트워킹 클래스를 탐구해 보세요. 이 각각의 클래스는 강력한 연결된 애플리케이션을 만드는 새로운 가능성을 열어줍니다.

계속 연습하고, 호기심을 가지고, 행복하게 코딩하세요!

Credits: Image by storyset