java

TcpIpMultichatSever

5DMK2]발자국 2014. 7. 2. 09:57

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