Java로 구현한 실시간 채팅 애플리케이션

Java 예제

중급 난이도
예제 타입
11/09 등록일

Java로 구현한 실시간 채팅 애플리케이션

중급
태그
예제 실습 프로젝트 소켓통신 채팅앱 멀티스레드 엔터프라이즈
## 프로젝트 개요
실시간 채팅 기능을 갖춘 간단한 클라이언트-서버 애플리케이션을 구현하여, 엔터프라이즈 환경에서 사용 가능한 실용적인 예제를 제공합니다. 이 예제는 소켓 통신을 통해 실시간으로 메시지를 전송하고 수신하는 기능을 포함하며, 다중 클라이언트의 동시 접속도 지원합니다.

## 주요 기능
- 실시간 채팅 기능
- 멀티스레드를 이용한 클라이언트 처리
- 메시지 로그 기록
- 사용자 입력 검증 및 에러 처리

## 사용 방법
1. 서버를 실행합니다.
2. 여러 개의 클라이언트로 연결하여 채팅을 진행합니다.
3. 메시지를 입력하면 실시간으로 전송됩니다.

## 확장 가능성
- 방별 채팅 기능 추가
- 사용자 인증 및 권한 관리 시스템 구현
- 메시지 저장 및 검색 기능 도입
코드 예제
// 서버 코드 (ChatServer.java)
import java.io.*;
import java.net.*;
import java.util.*;

public class ChatServer {
    private static final int PORT = 12345;
    private static Set<PrintWriter> clients = new HashSet<>();

    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(PORT)) {
            System.out.println("서버가 실행되었습니다. 포트: " + PORT);
            while (true) {
                Socket socket = serverSocket.accept();
                new Thread(new ClientHandler(socket)).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static class ClientHandler implements Runnable {
        private Socket socket;
        private PrintWriter out;
        private BufferedReader in;

        public ClientHandler(Socket socket) {
            this.socket = socket;
            try {
                out = new PrintWriter(socket.getOutputStream(), true);
                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void run() {
            String line;
            try {
                while ((line = in.readLine()) != null) {
                    System.out.println("받은 메시지: " + line);
                    broadcast(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                clients.remove(out);
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        private void broadcast(String message) {
            for (PrintWriter client : clients) {
                client.println(message);
                client.flush();
            }
        }
    }
}

// 클라이언트 코드 (ChatClient.java)
import java.io.*;
import java.net.*;
import java.util.Scanner;

public class ChatClient {
    private static final String SERVER_IP = "localhost";
    private static final int PORT = 12345;

    public static void main(String[] args) {
        try (Socket socket = new Socket(SERVER_IP, PORT)) {
            Scanner scanner = new Scanner(System.in);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

            System.out.println("서버에 연결되었습니다. 메시지를 입력하세요.");
            while (true) {
                String message = scanner.nextLine();
                if (message.equalsIgnoreCase("quit")) {
                    break;
                }
                out.println(message);
                out.flush();

                // 서버에서 전송된 메시지 읽기
                String response = in.readLine();
                System.out.println("서버: " + response);
            }
        } catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}
등록일: 2025년 11월 09일 02:35
언어 정보
언어
Java
카테고리
Enterprise
인기도
#3
학습 팁
코드를 직접 실행해보세요
변수를 바꿔가며 실험해보세요
오류가 나도 포기하지 마세요
다른 예제도 찾아보세요