TCP채팅 프로그램(양방향)

Soozoo·2024년 7월 1일

JAVA

목록 보기
35/41

Java로 TCP 채팅 프로그램 만들기

Java를 사용하여 간단한 TCP 채팅 애플리케이션을 구현하는 방법을 알아보겠습니다. 서버와 클라이언트가 서로 메시지를 주고받을 수 있는 애플리케이션을 만들 것입니다. 이 예제는 TCP 소켓 프로그래밍의 기본을 이해하는 데 도움이 됩니다.

1. 서버 구현

서버는 클라이언트의 연결을 기다리고, 클라이언트가 보내는 메시지를 수신하여 화면에 출력하고, 사용자가 입력한 메시지를 클라이언트로 전송합니다.

package ex03.net.tcp;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.*;

public class ServerEx {
    public static void main(String[] args) {
        BufferedReader br = null, stin = null;
        BufferedWriter bw = null;
        ServerSocket ss = null;
        Socket s = null;
        System.out.println("연결됨.....나는 서버야~~~~");

        try {
            ss = new ServerSocket(9999);
            s = ss.accept(); // 클라이언트의 연결을 기다림

            br = new BufferedReader(new InputStreamReader(s.getInputStream())); // 네트워크 통해서 데이터 읽기
            stin = new BufferedReader(new InputStreamReader(System.in)); // 키보드로부터 입력 받기
            bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); // 클라이언트로 데이터 보내기

            String inputMessage;

            while(true) {
                inputMessage = br.readLine(); // 클라이언트에서 한 행의 문자열 읽음
                if (inputMessage.equalsIgnoreCase("exit")) break; // 클라이언트가 "EXIT"를 보내면 연결 종료

                System.out.println(inputMessage); // 클라이언트가 보낸 메시지 화면에 출력

                String outputMessage = stin.readLine(); // 키보드에서 한 행의 문자열 읽음
                bw.write(s.getInetAddress() + " 서버> " + outputMessage + "\\n"); // 키보드에서 읽은 문자열 전송
                bw.flush();
            }

        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                s.close(); // 클라이언트 소켓 종료
            } catch (Exception e) {
                System.out.println("클라이언트와 채팅 중 오류 발생..............");
            }
        }
    }
}

서버 코드 설명

  1. 서버 소켓 생성: ServerSocket을 9999번 포트에 바인딩하여 생성합니다.
  2. 클라이언트 연결 수락: accept() 메서드를 호출하여 클라이언트의 연결 요청을 수락합니다.
  3. 입출력 스트림 설정: BufferedReaderBufferedWriter를 사용하여 클라이언트와의 데이터 통신을 처리합니다.
  4. 메시지 수신 및 전송: 클라이언트로부터 수신한 메시지를 콘솔에 출력하고, 키보드로 입력받은 메시지를 클라이언트로 전송합니다.
  5. 자원 해제: 사용한 소켓을 닫습니다.

2. 클라이언트 구현

클라이언트는 서버에 연결하여 메시지를 보내고, 서버로부터 응답을 받아 출력합니다.

package ex03.net.tcp;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.net.*;

public class ClientEx {
    public static void main(String[] args) {
        BufferedReader br = null, stin = null;
        BufferedWriter bw = null;
        Socket s = null;

        try {
            s = new Socket("192.168.0.143", 9999); // 서버에 연결
            br = new BufferedReader(new InputStreamReader(s.getInputStream())); // 네트워크 통해서 데이터 읽기
            stin = new BufferedReader(new InputStreamReader(System.in)); // 키보드로부터 입력 받기
            bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); // 서버로 데이터 보내기

            String outputMessage;

            while (true) {
                System.out.println("message input : ");
                outputMessage = stin.readLine(); // 키보드에서 한 행의 문자열 읽음

                if (outputMessage.equalsIgnoreCase("exit")) {
                    bw.write(outputMessage);
                    bw.flush();
                    break;
                }

                bw.write(s.getInetAddress() + " 클라이언트> " + outputMessage + "\\n"); // 키보드에서 읽은 문자열 전송
                bw.flush();

                String inputMessage = br.readLine(); // 서버로부터 한 행의 문자열 읽음
                System.out.println(inputMessage); // 서버가 보낸 메시지 화면에 출력
            }

        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                s.close(); // 클라이언트 소켓 종료
            } catch (Exception e) {
                System.out.println("Server 채팅 중 오류 발생..............");
            }
        }
    }
}

클라이언트 코드 설명

  1. 서버에 연결: 지정된 서버 IP와 포트로 소켓을 생성하여 서버에 연결합니다.
  2. 입출력 스트림 설정: BufferedReaderBufferedWriter를 사용하여 서버와의 데이터 통신을 처리합니다.
  3. 메시지 전송 및 수신: 키보드로 입력받은 메시지를 서버로 보내고, 서버로부터 수신한 메시지를 콘솔에 출력합니다.
  4. 자원 해제: 사용한 소켓을 닫습니다.

실행 방법

  1. 서버 실행: ServerEx 클래스를 먼저 실행하여 서버를 시작합니다. "연결됨.....나는 서버야" 메시지가 콘솔에 출력되면 서버가 정상적으로 실행된 것입니다.
  2. 클라이언트 실행: ClientEx 클래스를 실행하여 클라이언트가 서버에 연결하고 메시지를 전송합니다. 클라이언트와 서버 간의 메시지 주고받기를 콘솔에서 확인할 수 있습니다.

실행 결과

  1. 서버 오픈
  2. 클라이언트

    메세지가 양방향으로 잘 전송되는 것을 볼 수 있다.
profile
넙-죽

0개의 댓글