728x90
반응형

 

soket.zip

 

소켓 프로그래밍에 대하여.doc

 

이번에는 Java Socket 통신 예제를 소개한다. 완성된 코드는 soket.zip 으로 묶어서 첨부했으며, 소켓통신 프로그래밍에 대해 친절히  

설명한 문서를 추가로 첨부한다. 

 

다음은 Java Socket Server 쪽 메인 소스 코드이다. import된 클래스들의 소스는 첨부파일을 참고하기 바란다.

package soket.server;

 

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import org.apache.log4j.Logger;
import soket.server.communicator.Communicator;
import soket.server.communicator.LengthSpecificCommunicator;
import soket.server.connectionhandler.ConnectionHandler;
import soket.server.connectionhandler.ConnectionHandlerManager;
import soket.server.connectionhandler.NormalConnectionHandlerManager;
import soket.server.executor.CommandExecutor;
import soket.server.executor.CommandExecutorJobAdd;
import soket.server.requesthandler.CommandRequestHandler;

 

public class SimpleServer implements TCPServer {

 static Logger logger = Logger.getLogger(SimpleServer.class);

 private int threadID = 0;
 private ServerSocket server;
 private static boolean isClosed = false;
 private ConnectionHandlerManager connectionHandlerManager;
 
 public SimpleServer(){
  connectionHandlerManager = new NormalConnectionHandlerManager();
 }
 
 public static void main(String[] args) throws IOException{
  
  try{
   TCPServer server = new SimpleServer();
   server.startServer();
  }catch(Exception e){
   logger.info("main() error", e);
  }
 }
 
 /*
  * 소켓서버를 실행한다.
  */
 public void startServer() throws Exception
 {
   printMessage("소켓 서버를 실행합니다.");
   server = new ServerSocket(5000); //5000번 포트로 리슨

   //클라이언트와의 연결 대기 루프
   while( true ){

      try{
           printMessage("새로운 Client의 연결요청을 기다립니다.");

           Socket connectedSocket = server.accept(); //클라이언트와 연결될때까지 대기한다.
           printMessage("Client와 연결이 이루어지고 서비스를 시작합니다.");
    
           processService(connectedSocket, threadID++ ); //별도의  쓰래드를 생성해서  서비스 처리를 위임한다.
      }catch(Exception e){
           if( !(e instanceof java.net.SocketException && isClosed == true) ){
           printMessage("startServer() error", e);
      }
      break;
   }
  }
 }
 
 /*
  * 신규 클라이언트 접속시마다 새로운 Thread를 생성해서 서비스 처리를 위임한다.
  */
 private void processService(Socket connectedSocket, int serviceID) throws IOException {
  
  CommandRequestHandler requestHandler = null;
  try{
     requestHandler = new CommandRequestHandler();
     requestHandler.addCommand("add", new CommandExecutorJobAdd());
     requestHandler.addCommand("exit", new CommandExecutorExit());
  }catch(Exception e){
     printMessage("processService() error", e);
  }
  
  ConnectionHandler connectionHandler = connectionHandlerManager.createConnectionHandler(serviceID);
  //connectionHandler.keepConnection(new CommunicatorUTF(connectedSocket), requestHandler);
  connectionHandler.keepConnection(new LengthSpecificCommunicator(connectedSocket), requestHandler);
 }

 /*
  * 소켓버를 종료한다.
  */
 public void shutDownServer() throws Exception{
   isClosed = true;
   printMessage("서버 소켓의 연결을 닫습니다.");
   server.close();
   printMessage("열려진 서버 서비스가 있다면 종료합니다.");
   if(connectionHandlerManager != null) connectionHandlerManager.stop();
  
 }
 
 //로그 출력 함수(msg)
 private void printMessage(String msg){
  ServerLog.getInstance().info(this.getClass().getName(), msg);
 }
 //로그 출력 함수(msg, throwable)
 private void printMessage(String msg, Throwable e){
  ServerLog.getInstance().info(this.getClass().getName(), msg, e);
 }
 
 class CommandExecutorExit implements CommandExecutor{

   public void execute(String request, Communicator communicator) throws Exception {
     communicator.sendResponse("서버를 종료합니다.");
     shutDownServer();
   }

   public int stop() {
     return Stopable.STAT_IMMEDIATE;
   }
  }
}

 

다음은 Java Socket Client 쪽 소스코드이다.

package soket.client;

 

import java.awt.Robot;
import java.io.IOException;
import java.net.UnknownHostException;
import org.apache.log4j.Logger;
import junit.framework.TestCase;

 

public class SimpleClientMain extends TestCase{
 
 static Logger logger = Logger.getLogger(SimpleClientMain.class);
 
 public static void main(String[] args) throws UnknownHostException, IOException{
  
  try{
   

   String result;
   
   SimpleClient sc1 = new SimpleClient();
   SimpleClient sc2 = new SimpleClient();
   SimpleClient sc3 = new SimpleClient();
   
   //[1] ==== 서버에 연결 ==================
   setTimerOn(1); //1초 지연실행시킴
   logger.info("connect 1");
   sc1.connect("127.0.0.1", 5000);
   
   setTimerOn(1);
   logger.info("connect 2");
   sc2.connect("127.0.0.1", 5000);
   
   setTimerOn(1);
   logger.info("connect 3");
   sc3.connect("127.0.0.1", 5000);
   
   //[2] ==== 서버에 요청 ==================
   setTimerOn(2);
   logger.info("클라이언트1이 요청함");
   result = sc1.sendString("1번째 소켓요청 abc");
   logger.info("클라이언트1이 받은 결과 [" + result + "]");
   
   setTimerOn(3);
   logger.info("클라이언트2가 요청함 ");
   result = sc2.sendString("2번째 소켓요청 def");
   logger.info("클라이언트2가 받은 결과  [" + result + "]");

   setTimerOn(3);
   logger.info("클라이언트3이 요청함 ");
   result = sc3.sendString("아내/딸/아들/가족:엄마:아빠");
   logger.info("클라이언트3이 받은 결과 [" + result + "]");
   
   setTimerOn(3);
   logger.info("클라이언트1이 재요청함 ");
   result = sc3.sendString("재요청테스트1");
   logger.info("클라이언트1이 받은 결과 [" + result + "]");
   
   setTimerOn(3);
   logger.info("클라이언트2가 재 요청함 ");
   result = sc2.sendString("재요청테스트2 abc");
   logger.info("클라이언트2이 받은 결과 [" + result + "]");
   
   //[3] ==== 서버와 연결종료! ==================
   setTimerOn(3);
   logger.info("connect close 1");
   sc1.close();
   
   setTimerOn(2);
   logger.info("connect close 2");
   sc2.close(); 
   
   setTimerOn(2);
   logger.info("connect close 3");
   sc3.close();   
   
  }catch(Exception e){
   logger.info("Client 오류 발생!");
   e.printStackTrace();
  }
 }
 
   public static void setTimerOn(int nTimer)  throws Exception  // nTimer - 단위 : 초
   {
        int nDelayTime;
        nDelayTime = nTimer * 1000; // 밀리초 단위에 맞도록 *1000을 해준다.
       
        Robot tRobot = new Robot();
        tRobot.delay(nDelayTime);   // delay() 함수를 이용하여 nDelayTime 밀리초 동안 프로세스를 sleep 상태로 만든다.
  }
}

 

첨부한 '소켓 프로그래밍에 대하여' 글을 읽어면서 소스코드를 실행해 보면 이해가 쉬울것이다.

 

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,