TcpIpMultichatSever
import java.net.*;
import java.io.*;
import java.util.*;
public class TcpIpMultichatServer {
HashMap clients;
TcpIpMultichatServer() {
clients = new HashMap();
Collections.synchronizedMap(clients);
}
public void start() {
ServerSocket serverSocket = null;
Socket socket = null;
try {
serverSocket = new ServerSocket(7777);
System.out.println("서버가 시작되었습니다.");
while(true) {
socket = serverSocket.accept();
System.out.println("["+socket.getInetAddress() + ":"+socket.getPort()+"]"+"에서 접속하였습니다.");
ServerReceiver thread = new ServerReceiver(socket);
thread.start();
}
} catch(Exception e) {
e.printStackTrace();
}
} // start()
void sendToAll(String msg) { //[ 강사]반장 hello
Iterator it = clients.keySet().iterator();
String [] str = msg.split(" ");
int index = str[0].indexOf("]");
String na = str[0].substring(index+1);
if(clients.containsKey(na)){
try{
DataOutputStream out =(DataOutputStream)clients.get(na);
out.writeUTF(msg);
return;
}catch(IOException e){}
return;
}
while(it.hasNext()) {
try {
DataOutputStream out =
(DataOutputStream)clients.get(it.next());
out.writeUTF(msg);
} catch(IOException e){}
} // while
} // sendToAll
public static void main(String args[]) {
new TcpIpMultichatServer().start();
}
class ServerReceiver extends Thread {
Socket socket;
DataInputStream in;
DataOutputStream out;
ServerReceiver(Socket socket) {
this.socket = socket;
try {
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
} catch(IOException e) {}
}
public void run() {
String name = "";
try {
name = in.readUTF();
sendToAll("#"+name+"님이 들어오셨습니다.");
clients.put(name, out);
System.out.println("현재 서버접속자 수는 " + clients.size() + "입니다.");
while(in!=null) {
sendToAll(in.readUTF());
}
} catch(IOException e) {
// ignore
} finally {
sendToAll("#"+name+"님이 나가셨습니다.");
clients.remove(name);
System.out.println("["+socket.getInetAddress()+":"+socket.getPort()+"]"+"에서 접속을 종료하였습니다.");
System.out.println("현재 서버접속자 수는 "+ clients.size()+"입니다.");
} // try
} // run
} // ReceiverThread
} // class
TcpIpMultichatSever
clients - 접속된 클라이언트 저장
start() - 서버동작 - 클라이언트 접속시 쓰레드 생성
sendToAll(String msg)
- 채팅 내용을 접속된 모든 사용자에게 전달
ServerReceiver - Thread
접속된 사용자마다 하나의 쓰레드 구성
사용자의 채팅 내용을 읽고 전체에게 전달하는
SendToAll 메서드 호출
TcpIpMultichatClient
ClientSender - Thread
채팅 내용을 서버에게 전달
ClientReceiver Thread
서버에서 보내온 내용 읽기
귓속말 처리
- 전체글 인지 귓속말인지를 구별
ex) [aaa]bbb hello
[강사]반장 hello