Java를 사용하여 간단한 TCP 채팅 애플리케이션을 구현하는 방법을 알아보겠습니다. 서버와 클라이언트가 서로 메시지를 주고받을 수 있는 애플리케이션을 만들 것입니다. 이 예제는 TCP 소켓 프로그래밍의 기본을 이해하는 데 도움이 됩니다.
서버는 클라이언트의 연결을 기다리고, 클라이언트가 보내는 메시지를 수신하여 화면에 출력하고, 사용자가 입력한 메시지를 클라이언트로 전송합니다.
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("클라이언트와 채팅 중 오류 발생..............");
}
}
}
}
ServerSocket을 9999번 포트에 바인딩하여 생성합니다.accept() 메서드를 호출하여 클라이언트의 연결 요청을 수락합니다.BufferedReader와 BufferedWriter를 사용하여 클라이언트와의 데이터 통신을 처리합니다.클라이언트는 서버에 연결하여 메시지를 보내고, 서버로부터 응답을 받아 출력합니다.
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 채팅 중 오류 발생..............");
}
}
}
}
BufferedReader와 BufferedWriter를 사용하여 서버와의 데이터 통신을 처리합니다.ServerEx 클래스를 먼저 실행하여 서버를 시작합니다. "연결됨.....나는 서버야ClientEx 클래스를 실행하여 클라이언트가 서버에 연결하고 메시지를 전송합니다. 클라이언트와 서버 간의 메시지 주고받기를 콘솔에서 확인할 수 있습니다.
