package yoonforh.generic; /* * Copyright (c) 1996 Yoon Kyung Koo. All Rights Reserved. * * GenericServer.java * Author: Yoon Kyung Koo (yoonforh@interpia.net, http://interpia.net/~yoonforh) * Date: 10/24/96 * VERSION HISTORY * Last Update: 10/31/97 * Version: 1.00 (for JDK 1.02 API) * added finally clause in run method * Update: 10/25/96 * Version: 0.99 (for JDK 1.02 API) */ import java.net.*; import java.io.*; import java.util.Vector; import java.util.Date; public class GenericServer { private final static int DEFAULT_PORT = 6561; private static int port = DEFAULT_PORT ; private ConnectionManager cm = null; // ¿¬°áÀ» °ü¸®ÇÏ´Â ¾²·¹µå public static PrintStream log = null; public static void main(String args[]) { int next = 0; String arg; while (true) { try { arg = args[next++].toLowerCase(); if (arg.startsWith("-l")) // ·Î±× ÆÄÀÏ ÁöÁ¤ log = new PrintStream(new FileOutputStream(args[next++]), true); /* autoflush on */ else if (arg.startsWith("-p")) // Æ÷Æ® ¹øÈ£ ÁöÁ¤ port = Integer.parseInt(args[next++]); } catch (IOException i) { log = null; System.err.println("WARNING\tunable to create log file"); } catch (NumberFormatException n) { port = DEFAULT_PORT; System.err.println("WARNING\tbad port number, using 6561"); } catch (ArrayIndexOutOfBoundsException a) {break; } } new GenericServer(); } /* end main() */ GenericServer() { try { if (log == null) log = new PrintStream(System.out, true); log.println("GenericServer is initializing to port " + port); } catch (Exception i) {} cm = new ConnectionManager(port); // Á¢¼ÓÀ» °ü¸®ÇÏ´Â ¾²·¹µå »ý¼º. cm.start(); // ConnectionManagerÀÇ run() µµ±¸ È£Ãâ } } /* ConnectionManager´Â Á¢¼ÓÀ» ±â´Ù¸®´Ù°¡ Ŭ¶óÀ̾ðÆ®°¡ ¿¬°áÇØ¿À¸é ÇØ´ç Ŭ¶óÀ̾ðÆ®¸¦ ó¸®ÇÒ ServerConnection ¾²·¹µå¸¦ »ý¼ºÇÑ´Ù. ÀÏÁ¾ÀÇ µ¿±âÀûÀÎ ¸ÖƼÇ÷º½ÌÀÌ´Ù. */ class ConnectionManager extends Thread { private static int port; private static Vector my_threads = new Vector(5,2); /* ÃʱâÄ¡ 5, Áõ°¡Ä¡ 2ÀÎ º¤Å͸¦ »ý¼ºÇÑ´Ù. ÀÌ º¤ÅÍ¿¡´Â ¼ÒÄÏÀÌ ¿¬°áµÇ¸é »ý¼ºµÇ´Â ServerConnection ¾²·¹ µå ÀνºÅϽºµéÀÌ ÀúÀåµÈ´Ù. */ private ServerSocket main_socket = null; public ConnectionManager(int portNo) { port = portNo; } public void run() { serveRequests(); // ¼­¹ö ¼ÒÄÏÀ» »ý¼ºÇÏ¿© ¹«ÇÑ ·çÇÁ¸¦ µ¹´Ù°¡ Ŭ¶óÀ̾ðÆ®µéÀÌ Á¢¼ÓÇØ¿À¸é ¿¬°áÀ» »ý¼ºÇÏ¿© // °¢°¢ÀÇ ¿¬°á¿¡ ÇϳªÀÇ ¾²·¹µå¸¦ ¸¸µé¾îÁÖ´Â ·çƾÀÌ´Ù. } private void serveRequests() { try { main_socket = new ServerSocket(port); // ¼­¹ö ¼ÒÄÏ »ý¼º } catch(Exception e) { GenericServer.log.println("Exception ["+e+"] while binding to port ["+port+"]. exiting..."); System.exit(1); } ServerConnection temp_sc = null; while (true) // ¹«ÇÑ ·çÇÁ. ÀÌ ·çÇÁÀÇ Æ÷Æ®´Â ÁöÁ¤ÇÑ ¼­¹öÀÇ Æ÷Æ®ÀÌ´Ù. { try { Socket this_connection = main_socket.accept(); // ¼­¹ö ¼ÒÄÏÀÌ Å¬¶óÀ̾ðÆ®¸¦ ±â´Ù·È´Ù°¡ ¿¬°áÀ» »ý¼ºÇÑ´Ù. // accept()ÀÇ ¹Ýȯ°ªÀº Socket ÀνºÅϽºÀÌ°í ¾ÕÀ¸·Î ¿¬°áµÈ Ŭ¶óÀ̾ðÆ®¿Í // ´ëÈ­´Â ÀÌ ÀνºÅϽº¸¦ ÅëÇؼ­ ÇÑ´Ù. temp_sc = new ServerConnection(this_connection); // ¿¬°áÀÌ »ý¼ºµÇ¸é ÀÌ Socket ÀνºÅϽº·Î ServerConnection ¾²·¹µå¸¦ »ý¼º GenericServer.log.println("new Server Connection created"); temp_sc.start(); // ServerConnection ÀνºÅϽºÀÇ run() È£Ãâ my_threads.addElement(temp_sc); // ServerConnection ÀνºÅϽº¸¦ º¤ÅÍ¿¡ Ãß°¡ /* º¤ÅÍÀÇ Å©±â¸¸Å­ ·çÇÁ¸¦ ¹Ýº¹ÇÑ´Ù. º¤ÅÍ¿¡ ÀúÀåµÇ¾î ÀÖ´Â °¢ ServerConnection ¾²·¹µå°¡ ½ÇÇà ÁßÀÎÁö °Ë»çÇÏ°í ¾²·¹µå°¡ Á¾·áÇÏ¿´À¸¸é º¤ÅÍ¿¡¼­ Á¦°ÅÇÑ´Ù. ServerConnection ¾²·¹µå´Â ¼ÒÄÏÀ» Á¾·áÇÏ¸é ½ÇÇàÀ» Áß´ÜÇÑ´Ù. */ for(int i=0; i