[java] 자바 소켓 프로그래밍을 통한 채팅 애플리케이션 개발

이번에는 자바 소켓 프로그래밍을 사용하여 간단한 채팅 애플리케이션을 개발해보겠습니다. 소켓은 네트워킹을 위해 사용되는 일종의 통신 도구이며, 클라이언트와 서버 간에 데이터를 주고받을 수 있도록 도와줍니다.

프로젝트 구조

우선, 프로젝트를 구성하기 위해 다음과 같은 파일 구조를 가집니다:

- ChatServer.java
- ChatClient.java

서버 구현

먼저, ChatServer.java 파일을 만들고 아래와 같이 서버를 구현합니다.

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ChatServer {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(5000);
            System.out.println("서버가 시작되었습니다.");

            while (true) {
                Socket clientSocket = serverSocket.accept();
                System.out.println("클라이언트가 접속하였습니다.");

                // 클라이언트 처리를 위한 스레드 생성
                ClientHandler clientHandler = new ClientHandler(clientSocket);
                clientHandler.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

위의 코드는 간단한 서버를 생성하고 클라이언트의 연결을 기다리는 로직을 가지고 있습니다. 클라이언트가 접속하면 ClientHandler 스레드를 생성하여 클라이언트와의 통신을 처리합니다.

클라이언트 구현

이제, ChatClient.java 파일을 만들고 아래와 같이 클라이언트를 구현합니다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class ChatClient {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost", 5000);

            // 서버로부터 메시지를 받아올 Reader 스레드 생성
            Thread readerThread = new Thread(() -> {
                try {
                    BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                    String message;
                    while ((message = reader.readLine()) != null) {
                        System.out.println("[서버] " + message);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
            readerThread.start();

            // 키보드 입력을 받아 서버로 메시지를 보낼 Writer 스레드 생성
            Thread writerThread = new Thread(() -> {
                try {
                    PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
                    BufferedReader keyboardReader = new BufferedReader(new InputStreamReader(System.in));

                    String message;
                    while ((message = keyboardReader.readLine()) != null) {
                        writer.println(message);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
            writerThread.start();

            readerThread.join();
            writerThread.join();
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

위의 코드는 클라이언트를 구현한 것으로, 서버와의 통신을 담당하는 Reader 스레드와 메시지를 입력하여 서버로 전송하는 Writer 스레드를 생성합니다.

사용 방법

  1. ChatServer를 실행하여 채팅 서버를 시작합니다.
  2. ChatClient를 실행하여 채팅 클라이언트를 시작합니다.
  3. 클라이언트가 서버에 접속하면, 클라이언트는 서버로부터 오는 메시지를 읽고, 키보드로 입력한 메시지를 서버로 전송합니다.

결론

이번에는 자바 소켓 프로그래밍을 사용하여 채팅 애플리케이션을 개발하는 방법을 알아보았습니다. 소켓을 사용하면 클라이언트와 서버 간의 통신을 쉽게 구현할 수 있으며, 이를 활용하여 다양한 네트워크 기반 애플리케이션을 개발할 수 있습니다.

더 많은 자세한 내용은 아래의 참고 자료를 확인해보세요: