Java - Socket+Thread 실시간 채팅방

이전에는 소켓을 이용하여 한 번씩 문자열을 주고받았다면

이제는 스레드를 사용하여 데이터처리를 분산시켜서 시도해 봤어요..

 

서버 쪽에서 읽어들이는 스트림 - in

서버 쪽에서 보내는 스트림 - out

클라이언트에서 읽어들이는 스트림 - in

클라이언트에서 보내는 스트림 - out

 

서버와 클라이언트 측에서 읽어들이는 스트림 in 객체를 스레드로 넘겨

스레드에선 문자열을 읽어들여 프린트를 해주고

메인 영역에서는 스캐너로 입력받은 문자열을 쏴주는 역할을 하여

각각 다른 작업을 수행하게 만들었어요

 

서버 측

클라이언트 측

 

서버 측 소스코드>>

package d20230508;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

class ServerThread implements Runnable {
	BufferedReader in = null;

	public ServerThread(BufferedReader in) {
		this.in = in;
	}

	@Override
	public void run() {
		while (true) {
			try {
				String msg = in.readLine();
				if (msg.equalsIgnoreCase("quit")) {
					System.out.println("클라이언트에서 연결을 종료하였음!!");
					break;
				}
				System.out.println("클라이언트 : " + msg);
				Thread.sleep(100);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

public class ChatServer {

	public static void main(String[] args) {
		ServerSocket serversocket = null;
		Socket socket = null;
		BufferedReader in = null;
		PrintWriter out = null;
		Scanner sc = new Scanner(System.in);
		try {
			serversocket = new ServerSocket(5000);
			System.out.println("연결을 기다리고 있음..");
			socket = serversocket.accept();
			System.out.println("연결완료! 여기는 서버입니다.");
			out = new PrintWriter(socket.getOutputStream());
			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			Thread ct = new Thread(new ServerThread(in));
			ct.start();
			while (true) {
				String omsg = sc.nextLine();
				out.write(omsg + "\n");
				out.flush();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				serversocket.close();
				socket.close();
				in.close();
				out.close();
				sc.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

}

 

클라이언트 측 소스코드>>

package d20230508;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

class ClientThread implements Runnable {
	BufferedReader in = null;

	public ClientThread(BufferedReader in) {
		this.in = in;
	}

	@Override
	public void run() {
		while (true) {
			try {
				String msg = in.readLine();
				if (msg.equalsIgnoreCase("quit")) {
					System.out.println("서버에서 연결을 종료하였음!!");
					break;
				}
				System.out.println("서버:" + msg);
				Thread.sleep(100);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

public class ChatClient {
	public static void main(String[] args) {

		Socket socket = null;
		BufferedReader in = null;
		PrintWriter out = null;
		Scanner sc = new Scanner(System.in);

		try {
			socket = new Socket("localhost", 5000);
			System.out.println("연결완료! 여기는 클라이언트입니다.");
			out = new PrintWriter(socket.getOutputStream());
			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			Thread ct = new Thread(new ClientThread(in));
			ct.start();
			while (true) {
				String omsg = sc.nextLine();
				out.write(omsg + "\n");
				out.flush();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				socket.close();
				in.close();
				out.close();
				sc.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}
}

'Java > Basic' 카테고리의 다른 글

JSP+Servlet Ajax 사용하기  (0) 2025.02.24
JAVA - Thread 달팽이 경주 게임  (0) 2025.02.22
Java - JDBC 학생관리프로그램  (0) 2025.02.22
Java - JDBC 소코반 게임  (1) 2025.02.22
Java - JDBC CRUD 게시판 만들기 + 로그관리  (1) 2025.02.22