
1. 서버
package com.mtcoding.ex09;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.CopyOnWriteArrayList;
class ClientThread implements Runnable{
Socket socket;
PrintWriter sender;
Scanner receiver;
public ClientThread(Socket socket, PrintWriter sender, Scanner receiver) {
this.socket = socket;
this.sender = sender;
this.receiver = receiver;
}
@Override
public void run() {
// 새로운 스레드 대기중
while(true){
System.out.println("[server] 새로운 메시지 수신 대기중----------------");
String msg = receiver.nextLine();
for (ClientThread t : ChatServer.boxes){
t.sender.println(msg);
System.out.println("[server] 새로운 메시지 전체 브로드캐스팅----------------");
}
}
}
}
public class ChatServer {
static List<ClientThread> boxes = new CopyOnWriteArrayList<>();
public static void main(String[] args) {
try {
// 1. 초기화
ServerSocket ss = new ServerSocket(10000);
while(true){
Socket socket = ss.accept(); // main 스레드 대기
System.out.println("[server] 클라이언트연결됨--------");
PrintWriter sender = new PrintWriter(socket.getOutputStream(), true);
Scanner receiver = new Scanner(socket.getInputStream());
ClientThread t1 = new ClientThread(socket, sender, receiver);
boxes.add(t1);
new Thread(t1).start();
System.out.println("[server] 클라이언트 Socket, Buffer 2개, Thread 생성되서 Box 담김-------");
}
} catch (Exception e) {
System.out.println("서버 오류 : "+e.getMessage());
}
}
}
2. 클라이언트
package com.mtcoding.ex09;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class ChatClient {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost", 10000);
System.out.println("[client] 서버와 소켓이 연결되었음 -----------------");
Scanner keyboard = new Scanner(System.in);
Scanner receiver = new Scanner(socket.getInputStream());
PrintWriter sender = new PrintWriter(socket.getOutputStream(), true);
// 1. 송신 스레드
new Thread(() -> {
while(true){
System.out.println("[client] 쓰기 스레드 키보드 입력 대기중--------");
String msg = keyboard.nextLine();
sender.println(msg);
}
}).start();
// 2. 읽기 스레드
new Thread(() -> {
while(true){
System.out.println("[client] 읽기 스레드 다른 사람 메시지 수신 대기중--------");
String msg = receiver.nextLine();
System.out.println(msg);
}
}).start();
} catch (Exception e) {
System.out.println("클라이언트 오류 : "+e.getMessage());
}
}
}