본문 바로가기

[JAVA]

[JAVA]10월 7일 네트워크 프로그래밍 TCP (단체 채팅 서버코드 예제)

*단체 메인 채팅 서버

public class TCP_ChatServer {

public static void main(String[] args) {


ServerSocket serverSocket = null;

try {

serverSocket = new ServerSocket(5000);

while(true)

{

Socket socket = serverSocket.accept();

System.out.println("연결됨");

ChatReceiver receiver = new ChatReceiver(socket);

Thread rThread = new Thread(receiver);

rThread.start();

BufferedWriter bw = new BufferedWriter

(new OutputStreamWriter(socket.getOutputStream(), "UTF-8"));

ChatReceiver.getClientMap().put(socket.getInetAddress(), bw);

//소켓이 새로 연결 될때 이시버 스레드 동작시키고 해당 소켓에 대한 IP주소와 BW를 맵에 담음.

System.out.println(socket.getInetAddress() + "입장");

System.out.println("현재 입장중인 사람 ~~~~~~~");

for(InetAddress i : ChatReceiver.getClientMap().keySet())

{System.out.println(i);}

System.out.println("~~~~~~~~~~~~~~~~~~~~");

}

} catch (IOException e) {

e.printStackTrace();

}

}

}


*단체 체팅 리시버클래스.

public class ChatReceiver implements Runnable{

private static Map<InetAddress, BufferedWriter> clientMap;

static{

clientMap = new HashMap<InetAddress, BufferedWriter>();

Collections.synchronizedMap(clientMap); //여러개의 스레드가 안전하게 접근할 수 있도록 정리해주는 장치.

}

public static Map<InetAddress, BufferedWriter>getClientMap(){

return clientMap;

}

private Socket socket;

public ChatReceiver(Socket socket)

{

this.socket = socket;

}

@Override

public void run() {

try {

BufferedReader br = new BufferedReader

(new InputStreamReader(socket.getInputStream(),"UTF-8"));

String msg = null;

while((msg = br.readLine()) != null)

{

if(msg.equals("종료"))

{

break;

}

if(msg.startsWith("/"))

{//명령 시작

if(msg.charAt(1) == 'w')

{//귓속말

String[] tmp = msg.split(" ");

InetAddress ia = InetAddress.getByName(tmp[1]);

if(clientMap.get(ia) != null)

{

clientMap.get(ia).write(tmp[2] + "\n");

clientMap.get(ia).flush();

}

}


else if(msg.charAt(1) == 'g')

{//접속자 조희

for(InetAddress i : clientMap.keySet())

{

clientMap.get(socket.getInetAddress()).write(i + "\n");

clientMap.get(socket.getInetAddress()).flush();

}

}

else if(msg.charAt(1) == 'f')

{//기능 소개

BufferedWriter bw = new BufferedWriter

(new OutputStreamWriter(socket.getOutputStream()));

bw.write("----------------------------" + "\n");

bw.write("/w IP Message    귓속말" + "\n");

bw.write("/g               현재접속자" + "\n");

bw.write("/f               기능보기" + "\n");

bw.write("/m IP            상대방과 체팅모드" + "\n");

bw.write("----------------------------" + "\n");

bw.flush();

}

}

else

{

System.out.println(socket.getInetAddress() + " : " + msg);

for(BufferedWriter bw : clientMap.values())

{

bw.write(msg + "\n");

bw.flush();

}//지금까지 접속된 모든 socket의 bw들에 대해 msg전달.

}

}

catch (IOException e) {

System.out.println("문제 발생 프로그램을 종료합니다.");

}

finally

{

if(socket != null)

try {

System.out.println(socket.getInetAddress() + "연결종료");

clientMap.remove(socket.getInetAddress());

socket.close();

} catch (IOException e) {

e.printStackTrace();

}

System.exit(1);

}

}


}