¼Ò¼³°°Àº ÀÚ¹Ù 4ºÎ  Á¦17Àå ¼ÒÄÏÇÁ·Î±×·¥  17.6 äÆÃ¼­¹ö±¸Çö  

 ±×·³ ÀÌÁ¦ Á÷Á¢ ¼Ò½º¸¦ »ìÆìº¸°Ú½À´Ï´Ù. ÀÌ¹Ì À§¿¡¼­ Åë½ÅÀÇ °³³äÀ» È®½ÇÈ÷ ÇØ µÎ¼ÌÀ¸´Ï ¼Ò½º¸¦ º¸¼Åµµ º°·Î ¸·È÷´Â ºÎºÐÀÌ ¾ø°ÚÁö¸¸, Çѹø ´õ È®ÀÎÇÑ´Ù´Â Â÷¿ø¿¡¼­, ÀÚ¼¼È÷ »ìÆìº¸µµ·Ï ÇϰڽÀ´Ï´Ù.

 

 ¸ÕÀú ServerSocketÀ» »ý¼ºÇϰí, Ŭ¶óÀÌ¾ðÆ®¿ÍÀÇ ¿¬°áÀ» ¹× ¸Þ½ÃÁö¸¦ ó¸®ÇØÁÖ´Â ¼­¹ö ÇÁ·Î±×·¥À» »ìÆìº¸°Ú½À´Ï´Ù.

 

ChatServer.java(¼­¹ö ÇÁ·Î±×·¥)

import java.io.*;

import java.net.*;

import java.util.*;

public class ChatServer {

   private ServerSocket socket = null;

   private Vector v = new Vector();

   //public ChatServer() { }

   public void message(String msg) {

       System.out.println(msg);

       for (int i=0;i<v.size();i++) {

          ((Client)v.elementAt(i)).sendMessage(msg);

       }

   }

   public void addClient(Client c) {

       v.addElement(c);     

   }

   public void removeClient(Client c) {

       String userId = c.getUserId();

       c.closeSocket();

       boolean b = v.remove(c);

       System.out.println(userId + "´ÔÀÌ ³ª°¡¼Ì½À´Ï´Ù.");

   }

   public void setServerSocket(int port) {

       try {

          socket = new ServerSocket(port);

          System.out.println("´ë±âÁß");

       } catch (IOException e) {

          System.out.println("¼­¹ö ¼ÒÄÏ »ý¼º ½ÇÆÐ");

       }

       while(true) {

          try {

             Socket server = socket.accept();

             Client c = new Client(server, this);

             addClient(c);

             c.start();

          } catch(IOException e) {

             System.out.println("Ŭ¶óÀÌ¾ðÆ® Á¢¼Ó ½ÇÆÐ");

          }

       }

   }

   public static void main(String args[]) {

       int port = 5000;

       ChatServer cs = new ChatServer();

       cs.setServerSocket(port);

   }

}

class Client extends Thread {

   private Socket server = null;

   private ChatServer cs = null;

   private BufferedReader br = null;

   private BufferedWriter bw = null;

   private String userId = "";

   public Client(Socket s, ChatServer cs) {

       this.server = s;

       this.cs = cs;

       try {

          br = new BufferedReader(new InputStreamReader(server.getInputStream()));

          bw = new BufferedWriter(new OutputStreamWriter(server.getOutputStream()));

          userId = br.readLine();

       } catch (IOException e) { }

   }

   public void run() {

       String msg = "";

       cs.message(userId + "´Ô ȯ¿µÇÕ´Ï´Ù!");

       while (true) {

          try {

             msg = br.readLine();

             cs.message(userId + ":" + msg);

          } catch (IOException e) {

             cs.removeClient(this);

             break;

          }

       }

   }

   public void sendMessage(String msg) {

       try {

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

          bw.flush();

       } catch (IOException e) {}

   }

   public String getUserId() {

       return userId;

   }

   public void closeSocket() {

       try {

          br.close();

          bw.close();

          server.close();

       } catch (IOException e) { } 

   }

}

C:\javaSource\chat>javac ChatServer.java

C:\javaSource\chat>java ChatServer

´ë±âÁß

jabook´Ô ȯ¿µÇÕ´Ï´Ù!

jabook:¾È³çÇϼ¼¿ä

jabook:ÀÚ¹Ù°¡ ¾î¶°¼¼¿ä?

jabook:¿­½ÉÈ÷ ÇϽʽÿä.

 

 

 À§ÀÇ ¼Ò½º´Â ¿øÃÊÀûÀΠäÆÃ ¼Ò½º¶ó ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿©·¯ºÐÀÇ ÀÌÇØ¸¦ µ½±â À§ÇØ ÀÎÅÍÆäÀ̽º´Â ´Ü¼øÈ­½ÃÄ×½À´Ï´Ù. À§ÀÇ ¿¹Á¦´Â ServerSocket »ý¼º°ú Vector¸¦ °ü¸®ÇÏ´Â ChatServerŬ·¡½º¿Í ½º·¹µå¸¦ »ý¼ºÇؼ­ Ŭ¶óÀ̾ðÆ®ÀÇ Á¤º¸¸¦ Vector¿¡ ÀÔ·ÂÇÏ´Â ClientŬ·¡½º·Î Å©°Ô ³ª´­ ¼ö ÀÖ½À´Ï´Ù. °¢°¢ÀÇ Å¬·¡½º¿¡ ÀÖ´Â ¸Þ¼­µå¸¦ È£ÃâµÇ´Â ¼ø¼­¿¡ µû¶ó ´ë·«ÀûÀ¸·Î »ìÆì º¸°Ú½À´Ï´Ù.

 

 ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ¸é Á¦ÀÏ ¸ÕÀú ½ÇÇàµÇ¾î ChatServerŬ·¡½ºÀÇ °´Ã¼¸¦ »ý¼ºÇÕ´Ï´Ù. Ŭ¶óÀÌ¾ðÆ®¿¡ ¿¬°áÇÒ ¶§ »ç¿ëÇÒ Æ÷Æ®¹øÈ£¸¦ ¸Å°³º¯¼ö·Î °®´Â ServerSocketÀ» »ý¼ºÇϵµ·Ï getServerSocket()¸Þ¼­µå¸¦ È£ÃâÇÕ´Ï´Ù. Æ÷Åä ¹øÈ£´Â ÀÓÀÇ·Î ¡®5000¡¯À» ºÎ¿©Çϰí ÀÖ½À´Ï´Ù.

 

n        public static void main(String args[]) {

n           int port = 5000;

n           ChatServer cs = new ChatServer();

n           cs.setServerSocket(port);

n        }

 

ÀÚ¹Ù¿¡¼­´Â °£´ÜÇÑ ¼­¹ö¸¦ ±¸¼ºÇϱâ À§Çؼ­ ServerSocketÀ» Á¦°øÇÕ´Ï´Ù. »ý¼ºÀÚ¸Þ¼­µå¿¡ ¸Å°³º¯¼ö·Î Æ÷µå¹øÈ£¸¦ ÁöÁ¤ÇØ ÁÙ ¼ö ÀÖ½À´Ï´Ù. Ŭ¶óÀÌ¾ðÆ®´Â ¼­¹ö¿¡ Á¢¼ÓÇÒ ¶§ ÀÌ Æ÷Æ®¹øÈ£·Î Á¢¼ÓÀ» ¿äûÇÕ´Ï´Ù. ServerSocketÀÌ »ý¼ºµÇ¸é ±× ´ÙÀ½¿¡´Â °¢ Ŭ¶óÀ̾ðÆ®ÀÇ Á¢¼ÓÀ» °ü¸®ÇÒ SockectÀ» »ý¼ºÇϰí accept()¸Þ¼­µå¸¦ È£ÃâÇÕ´Ï´Ù. accept()¸Þ¼­µå´Â Ŭ¶óÀ̾ðÆ®ÀÇ Á¢¼ÓÀ» ±â´Ù¸®°í ÀÖ´Ù°¡ Á¢¼ÓÀÌ µÇ¸é Socket°´Ã¼¸¦ ¹ÝȯÇÕ´Ï´Ù. ½º·¹µå¸¦ ¸¸µé±â À§ÇØ ClientÀÇ °´Ã¼¸¦ »ý¼ºÇؼ­ socket°ú ÀÚ±â ÀÚ½ÅÀ» ¸Å°³º¯¼ö·Î ³Ñ±ä ÈÄ¿¡ addClient()¸Þ¼­µå¸¦ È£ÃâÇÕ´Ï´Ù. start()¸Þ¼­µå·Î ½º·¹µå¸¦ ½ÃÀÛÇÕ´Ï´Ù.

 

n        public void setServerSocket(int port) {

n           try {

n              socket = new ServerSocket(port);

n              System.out.println("´ë±âÁß");

n           } catch (IOException e) {

n           System.out.println("¼­¹ö ¼ÒÄÏ »ý¼º ½ÇÆÐ");

n        }

 

ClientÀÇ °´Ã¼°¡ »ý¼ºµÇ±âÀü¿¡ ½º·¹µå¸¦ »ó¼Ó¹ÞÀº ClientŬ·¡½ºÀÇ »ý¼ºÀÚ¸Þ¼­µå°¡ È£ÃâµË´Ï´Ù. Socket°ú ChatServer°¡ ¸Å°³º¯¼ö·Î ³Ñ¾î¿É´Ï´Ù. »ç¿ëÀÚ°¡ º¸³»´Â ¸Þ½ÃÁö¸¦ ¹®ÀÚ¿­ ½ºÆ®¸²À¸·Î ó¸®Çؼ­ ¹öÆÛ¿¡ ÀÔÃâ·ÂÇÒ ¼ö ÀÖµµ·Ï BufferedReader¿Í BufferedWriterÀÇ °´Ã¼¸¦ »ý¼ºÇÕ´Ï´Ù.

 

n        public Client(Socket s, ChatServer cs) {

n           this.server = s;

n           this.cs = cs;

n           try {

n               br = new BufferedReader(new InputStreamReader(server.getInputStream()));

n               bw = new BufferedWriter(new OutputStreamWriter(server.getOutputStream()));

n              userId = br.readLine();

n           } catch (IOException e) {  }

n        }

 

Á¢¼ÓÇÑ »ç¿ëÀÚ¸¦ º¤ÅÍ¿¡ ÀúÀåÇÕ´Ï´Ù.

 

n        public void addClient(Client c) {

n           v.addElement(c);  

n        }

 

start()¸Þ¼­µå°¡ È£ÃâµÈ ÈÄ ÀÚµ¿À¸·Î run()¸Þ¼­µå°¡ È£ÃâµË´Ï´Ù. ChatClientÀÇ message()¸Þ¼­µå¸¦ È£ÃâÇØ ¸Å°³º¯¼ö·Î userId¸¦ ³Ñ±é´Ï´Ù. ¹öÆÛ¿¡ ÀÔ·ÂµÈ ³»¿ëÀ» ÇÑ ÁÙ¾¿ ÀÐ¾î º¤ÅÍ¿¡ ÀúÀåÇϱâ À§ÇØ message()¸Þ¼­µå·Î º¸³À´Ï´Ù. ¿¹¿Ü°¡ ¹ß»ýÇϸé removeClient()¸Þ¼­µå¸¦ È£ÃâÇÑ ÈÄ, break·Î ºüÁ®³ª¿É´Ï´Ù.

 

n        public void run() {

n           String msg = "";

n           cs.message(userId + "ÀÌ ÀÔÀåÇϼ̽À´Ï´Ù.\nȯ¿µÇÕ´Ï´Ù!");

n           while (true) {

n              try {

n                 msg = br.readLine();

n                 cs.message(userId + ":" + msg);

n              } catch (IOException e) {

n                 cs.removeClient(this);

n                 break;

n              }

n           }

n        }

 

º¤ÅÍ¿¡ ÀúÀåµÈ ¸Þ½ÃÁö¸¦ Àоî¿É´Ï´Ù. óÀ½ ¿¬°áµÇ¾úÀ» ¶§´Â ´Ü¼øÈ÷ id¸¸À» Àо º¯¼ö userId¿¡ ÇÒ´çÇ߱⠶§¹®¿¡ ȯ¿µÀÇ ±Û¸¸ÀÌ Å¬¶óÀ̾ðÆ®ÀÇ È­¸é¿¡ Ãâ·ÂµÇ°í ´ÙÀ½ºÎÅÍ´Â id¿Í ¸Þ½ÃÁö°¡ °°ÀÌ º¤ÅÍ¿¡ ÀúÀåµË´Ï´Ù. ½º·¹µå·Î º¤ÅÍ¿¡ ÀÔ·ÂµÈ ¸Þ½ÃÁö¸¦ Çϳª¾¿ ¹öÆÛ·Î º¸³»±â À§ÇØ º¤ÅÍÀÇ Å©±â¸¸Å­ for¹®À» µ¹·Á º¤ÅÍÀÇ i¹øÂ°¿¡ ÀÖ´Â °´Ã¼, ´Ù½Ã¸»Çؼ­ id¿Í ¸Þ½ÃÁö¸¦ elementAt()¸Þ¼­µå¸¦ »ç¿ëÇØ¼­ ¹Ýȯ¹Þ½À´Ï´Ù. À̶§ º¤ÅÍ¿¡¼­ ¹ÝȯµÇ´Â °´Ã¼´Â ObjectÇüÀ̱⠶§¹®¿¡ ClientÇüÀ¸·Î ´Ù¿îij½ºÆÃÀ» ÇØÁÖ¾î¾ß ÇÕ´Ï´Ù.

 

n        public void message(String msg) {

n           System.out.println(msg);

n           for (int i=0;i<v.size();i++) {

n              ((Client)v.elementAt(i)).sendMessage(msg);

n           }

n        }

 

 BufferedWriterŬ·¡½ºÀÇ write()¸Þ¼­µå·Î »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ ³»¿ëÀ» ¹öÆÛ¿¡ ÀÔ·ÂÇÕ´Ï´Ù.

 

n        public void sendMessage(String msg) {

n           try {

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

n              bw.flush();

n           } catch (IOException e) {}

n        }

 

»ç¿ëÀÚ°¡ Á¢¼ÓÀ» ²÷À¸¸é closeSocket()¸Þ¼­µå¸¦ È£ÃâÇØ¼­ ¼ÒÄÏÀÇ, remove()¸Þ¼­µå·Î ÇØ´ç »ç¿ëÀÚ¸¦ º¤ÅÍ¿¡¼­ Á¦°ÅÇÕ´Ï´Ù.

 

n        public void removeClient(Client c) {

n           String userId = c.getUserId();

n           c.closeSocket();

n           boolean b = v.remove(c);

n           System.out.println(userId + "ÀÌ ÅðÀåÇϽʴϴÙ.");

n        }

 

´Ü¼øÈ÷ ¿¬°áÇÑ »ç¿ëÀÚÀÇ id¸¦ ¹ÝȯÇÕ´Ï´Ù.

 

n        public String getUserId() {

n           return userId;

n        }

 

¸Þ¼­µå°¡ È£ÃâµÇ¸é ¿¬°áµÇ¾ú´ø BufferedReader, BufferedWriter ±×¸®°í SocketÀ» Â÷·Ê·Î ²÷½À´Ï´Ù.

 

n        public void closeSocket() {

n           try {

n              br.close();

n              bw.close();

n              server.close();

n           } catch (IOException e) {  } 

n        }



jabookÀúÀÚ¸íÇÔ
Á¦¸ñ:¼Ò¼³°°ÀºÀÚ¹Ù4ºÎ
ÀúÀÚ:ÃÖ¿µ°ü