±×·³ ÀÌÁ¦ Á÷Á¢ ¼Ò½º¸¦ »ìÆìº¸°Ú½À´Ï´Ù. ÀÌ¹Ì À§¿¡¼ Åë½ÅÀÇ °³³äÀ» È®½ÇÈ÷ ÇØ µÎ¼ÌÀ¸´Ï ¼Ò½º¸¦ º¸¼Åµµ º°·Î ¸·È÷´Â ºÎºÐÀÌ ¾ø°ÚÁö¸¸, Çѹø ´õ È®ÀÎÇÑ´Ù´Â Â÷¿ø¿¡¼, ÀÚ¼¼È÷ »ìÆìº¸µµ·Ï ÇϰڽÀ´Ï´Ù.
¸ÕÀú 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ºÎ ÀúÀÚ:ÃÖ¿µ°ü |