자바 - 소켓 클래스와 예제
안녕하세요, 자바 프로그래밍에 도전하는 여러분! 오늘 우리는 자바의 소켓 클래스를 사용한 네트워크 프로그래밍의 세계로 흥미로운 여정을 시작할 것입니다. 여러분의 친절한 이웃 컴퓨터 과학 교사로서, 이 모험을 안내해 드리는 것을 기쁘게 생각합니다. 프로그래밍에 처음 도전하는 분이라면 걱정하지 마세요 - 우리는 기본부터 시작해 점진적으로 학습할 것입니다. 그러니 가상의 헬멧을 쓰고, 함께 뛰어들어 보세요!
소켓이란?
코드로 들어가기 전에, 소켓이 무엇인지 이해해 보겠습니다. 친구에게 전화를 걸려고 할 때, 두 가지가 필요합니다: 친구의 전화번호와 전화기. 컴퓨터 네트워킹에서 소켓은 그 전화기와 같은 역할을 합니다 - 두 개의 프로그램 간의 이원 통신 링크의 종단점입니다.
자바 소켓 클래스
자바의 소켓 클래스는 클라이언트 측 소켓을 나타냅니다. 이 클래스는 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();
}
}
}
이 코드를 단계별로 설명하겠습니다:
- 필요한 클래스를 임포트합니다.
-
main
메서드 내에서 예외 처리를 위해 try-catch 블록을 사용합니다. - 새로운
Socket
객체를 생성하고 지정된 서버 주소("localhost"는 동일한 기계를 의미)와 포트 번호(12345)에 연결합니다. - 서버로 데이터를 보내기 위한
PrintWriter
를 생성합니다. - 서버에 메시지를 보냅니다.
- 서버로부터 데이터를 받기 위한
BufferedReader
를 생성합니다. - 서버의 응답을 읽고 출력합니다.
- 모든 스트림과 소켓을 닫아 자원을 해제합니다.
이제 서버 코드를 만들어 보겠습니다. 클라이언트가 작동하기 위해서는 동일한 포트에서 리스닝 중인 서버가 필요합니다.
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();
}
}
}
이 서버 코드는 다음과 같은 작업을 수행합니다:
- 포트 12345에서 서버 소켓을 생성합니다.
- 클라이언트가 연결될 때까지 기다립니다.
- 클라이언트로부터 데이터를 받기 위한 입력 스트림을 생성합니다.
- 클라이언트로 데이터를 보내기 위한 출력 스트림을 생성합니다.
- 클라이언트의 메시지를 읽고 출력합니다.
- 클라이언트에 응답을 보냅니다.
- 모든 연결을 닫습니다.
이 예제를 실행하려면 다음과 같이 합니다:
- 먼저
SimpleSocketServer
클래스를 실행합니다. - 그런 다음
SimpleSocketClient
클래스를 실행합니다.
이렇게 하면 클라이언트가 서버에 연결하고 메시지를 보내고, 서버가 응답을 보내는 것을 볼 수 있습니다!
결론
축하합니다! 여러분은 자바 소켓을 사용한 첫 번째 클라이언트-서버 애플리케이션을 만들었습니다. 이 것은 네트워크 프로그래밍의 표면에 불과하지만, 아주 좋은 시작입니다.
기억하시길, 소켓은 전화처럼 - 프로그램이 네트워크를 통해 서로 소통할 수 있게 합니다. 이 지식을 바탕으로, 채팅 프로그램, 멀티플레이어 게임, 분산 시스템과 같은 더 복잡한 네트워크 애플리케이션을 만들 수 있습니다.
자바 여정을 계속하면서, ServerSocket
, URL
, URLConnection
과 같은 다른 네트워킹 클래스를 탐구해 보세요. 이 각각의 클래스는 강력한 연결된 애플리케이션을 만드는 새로운 가능성을 열어줍니다.
계속 연습하고, 호기심을 가지고, 행복하게 코딩하세요!
Credits: Image by storyset