반응형
스택 예제를 예전에 구현하였던것을...

이곳에 다시 올려 둡니다.

// 스택//
#include<stdio.h>
#include<conio.h>

int stack[10];
int top;

void init_stack() {
    top = -1;
}

void push(int vall) {
  if(top >= 9)
    printf("\n######## 스택이 꽉 차버렸네요 ########\n");
  else
    stack[++top] = vall;
}

void pop() {
  if(top < 0) 
    printf("########## 더이상 비울 스택이 없습니다. ##########\n");
  else
    --top;
}

void print_stack() {
  int i;
  printf("스택 top --------------------- buttom\n");

  for(i = top; i>= 0; i--)
    printf("%d ", stack[i]);
    printf("\n");
}

void main() {
  int select_num;
  int push_num;
  int exit_flag = 0;

  printf(" 배열을 이용한 스택 프로그램 입니다. \n");

  init_stack();
  while(1) {
    printf(" 1) push 2) pop 3) data print 4) Quit! \n");
    printf(" 숫자를 선택해 주세요 : ");
    scanf("%d",&select_num);
 
    if(select_num > 3) break;
    else {
      switch(select_num) {
         case 1 :
           printf("푸쉬 숫자를 입력해 주세요 =>");
           scanf("%d",&push_num);
           push(push_num);
           printf("푸쉬(push)를 실행 했습니다\n");
         break;
         case 2:
           pop();
           printf("팝(pop)을 실행했습니다\n");
         break;
         case 3:
           print_stack();
         break;
      }
    }
  }
  printf("프로그램을 종료합니다\n");
  getch();
}
반응형
Posted by onlyTheOne
,
반응형
안녕하세요

오랜만에 강좌를 진행하는 쥔장입니다.

텍스트만 있으니 좀 그러시죠 ^^:

저도 이미지도 넣고 그러고 싶답니다.~~~

하지만 그러기는 많이 힘들다는거..

하지만 노력해 보려 합니다.

그 이야기 계속 이어 가려 합니다.

제가 자바라는 언어를 처음 접하게 된 것은...

자바로 만들어진 하늘사랑 채팅 방일 겁니다...

처음 자바라는 언어를 배운건...

2000년 4월.... 모 학원에서 시작하였습니다.

당시 저는 고2.....  (제 나이 대충 계산 되시죠 ^^:)

음 그러니... 운영체제이니, 알고리즘이니, 자료구조이니...

이런건 그냥 자격증을 따기 위한 목적으로 머 제대로 배우지도 않았지만...

프로그램이 왜 저렇게 돌아가느냐.. 이런걸 모르는 나이 였습니다.

그러니 제가 프로그램을 잘 짜는 줄 알았죠..

바로 전에는 VC++을 잠깐 배우고 있었습니다.

머 VC++이래 봤자 API가 아닌 MFC 였지만...

그렇게 시작한 자바라는 언어와의 인연...

처음 시작은... 일찍 하였으나...

저는 자바라는 언어의 빛을 많이 못 봤습니다...

하지만 좋은 분들과의 인연을 만들수 있었다는게..

(자바동 형들.. 형 들을 알게된게 저에겐 행운중 하나 였습니다.)

2001년 각종 소프트웨어 공모전에 나갔지만 전부

예선탈락이라는 수모를 당했습니다...

예선 탈락을 당한 이유는 세가지 였습니다.

하나는 심사위원분들이 자바라는 언어로 프로그램을 짤수 있는 고등학생은 없다. 라고 단정 지은 겁니다.

즉 누가 만들어서 대신 출품 하는 거라고 생각한 거죠..

자바가 2000년에 퍼지기 시작하였으니.. 그럴수 밖에요...

이건 좀 나았지만...

두번째는 심사위원분들이... 자바를 모르시는 은근히 많았습니다...

결론적으로 자바를 모르기에... 심사가 불가능하여 탈락 된거죠..

일화를 하나 말씀드리면 당시 제가 참여한 모학교 대회에 제가 출품한 작품이..

화상강의 소프트웨어 였습니다...

그런데.. 그날 출품한 학생중에.. 저와 똑같은 아이디어로 VC++로 만든 학생이 있었던 겁니다.

발표날 저는 깜짝 놀랐습니다.

그 학생은 2위를 한 것입니다.  프로그램 완성도야 자바 보다 는 좋았을 겁니다.

하지만 저는 예선 탈락이였습니다...

더욱 저를 힘들게 했던건.. 그 출품작이 이미 타 대회 입상 작품이였다는 겁니다...

한마디로 하나의 작품으로 우려 먹기를 한거죠...

그렇게... 쓴맛을 보며 공모전을 마감하며 자바와 세월을 보냈습니다...

2001년 저는 JMF라 불리우는 Java Media Framework API를 공부하며...

화상/음성 관련 부분에 대해 공부하고 있었습니다.. 물론 결과물이..

이런거 관련된 것만 나오게 됬죠... 당시 제가 JSP나 moblie로 갔다면

아마 다른 일이 발생했을 수도... 남들이 안한다는걸 한다고 자부심을 느끼며

제대로 모르는 초짜가 사고를 치며 살아 온것입니다.

자바를 잘한다고 느끼며... 전혀 아니였지만...

여기서.. 제 이야기를 마치고..

자바에 대해 다시 이야기 해 보려 합니다.

제가 자바를 처음 공부할때 자바의 버전은 혁명이라 불릴 만큼 변화가 있어서

Java2라고 불리우는 JDK 버전 1.2.1 이였습니다.. 지금 1.6이니 오래 된걸 수도 있겠네요...

그때 쓰던 IDE 중 하나가 3.0 이였고.. 윈도우가 98에서 2000으로 변화 하는 시기였습니다.

다시 생각해 보면 2000 professional 버전은 정말 가볍고 안정적인 OS인거 같습니다...

지금은 윈도우 2003 -> 비스타 까지 나왔으니..

하긴 벌써 2007년이 끝나 가니깐요.... 내년이면 벌써 자바를 안지 8년이 되가네요...

그동안 자바라는 언어를 하면서 무얼 했나 세삼 돌이켜 봅니다...

사장된 기술....그리고 잘못 선택한 choice.... 시련... 고독........

to be continue...
반응형
Posted by onlyTheOne
,
반응형

Prime 구하기 소스 올립니다.


(defun tf_prime(n i)
       (setq j 1)
       (loop
            (cond ((= (- n (* i j)) 0) (return nil))
                  ((< (- n (* i j)) i) (return t)))
            (setq j (+ j 1))))


(defun p_prime(n)
       (let ((nmt (/ (+ n 1) 2)) (counting 2))
            (loop
                (cond ((< n 4) (return t))
                      ((NOT (tf_prime n counting)) (return nil))
                      ((= counting nmt) (return t)))
                (setq counting (+ counting 1)))))


실행 방법 : ( p_prime 17) <- 요렇게 하시면 됩니다.

이렇게 되구요... 입력수가 Prime이면... T를... 아니면 nil을 반환 합니다.

사용자 지정구간에 대한 Prime은 어디가 문제 인지 모르겠는데.. 결과 도출이 또 제대로 안되네요 ㅡㅡ;

관련 부분은 소스 코드 점검을 해봐야 될거 같습니다.

구간 점검을 위한 prime 구하는 소스는 다음 번에 올려 드리겠습니다.

반응형
Posted by onlyTheOne
,
반응형

소스코드는 관련 사항입니다.

제작 환경은

OS : Windows XP Home Edition servicePack 2

JDK버전 : java 1.5.0_11

기타 사항 : SWT 툴킷 사용(가장 최신 버전)

사용 IDE : Eclipse 3.2 version

SWT와 Browser 위젯사용법에 대해서는 아래 사이트를 참조 하세요
(출처 이클립스 카페) http://www.java2s.com/Tutorial/Java/

소스 관련 문의는 게시판에 글로 올려 주시길 바랍니다.

/*----------------- 소스 코드 -------------------------*/

import! org.eclipse.swt.*;
import! org.eclipse.swt.SWT;
import! org.eclipse.swt.graphics.Point;
import! org.eclipse.swt.layout.*;
import! org.eclipse.swt.widgets.*;
import! org.eclipse.swt.browser.*;
import! org.eclipse.swt.graphics.*;
import! org.eclipse.swt.events.*;

/* 프로그램 정보
 *  제작자 : Kay
 *  연락처 : 여기 덧글 게시판 아니면 맨 아래 카페 주소로 이야기 해 주세요
 *  제작목적 : 업무에 좀 보탬이 되볼려고...
 *  기능... 그냥 익스플로러와 같다... 단지 다른점이라면...
 *  익스플로러와 달리 어느 사이트에서든지 소스 보기가 되었다가 안되는 곳이 생겼음
 *  제작일 :
 *  제 1 차 : 2007년 4월 25일 ~ 2007년 5월 12일 .....
 *  후기 :
 *   겁나 삽질 많이 했다.. 진짜......
 *   도움이 된 사이트가 있다면....
 *   http://www.java2s.com/Tutorial/Java/
 *   위 사이트에서 SWT 사용법을 익혔다......
 * 
 *  이 프로그램도.... 내가 진행하는 오픈프로젝트의 원칙에 따라 공개하는 바이다.. 소스 copy해서 써도 된다..
 *  단! 원본에 대한 출처를 실행시 도움말에 반드시 적어야 한다.. 그렇지 않을경우 저작권법에 의해 소송 당하실수도 있습니다.
 */

public class nm_Frame {
 
 Display display = null; // 디스플레이
 
 Shell sh = null; // 쉘 화면....
 
 Browser brow = null; // 브라우져 화면
 
 Composite panel = null; // 자바에서 패널 역할을 하는 중간 컨테이너 위젯
 Composite pan_s = null; // 하단 컨테이너
 
 Label name = null; // 표기용
 
 Button back = null; // 뒤로가기
 Button next = null; // 앞으로돌아가기
 Button update = null; // 새로고침
 Button stop = null; // 중지하기
 
 Text url_t = null; // 주소 입력창
 
 Text url_s = null; // 커서로 지정된 부분 url 보기
 Label loc_s = null; // location Event 확인
 ProgressBar p_bar = null; // 상태 바...
 
 // 메뉴 컴포넌트 선언
 Menu main_m = null;//메뉴바가 될 부분..
 MenuItem file_m = null; //파일메뉴
 Menu file_s = null;// 파일메뉴 하위...
 MenuItem s_update = null; //새로고침
 MenuItem s_back = null; // 뒤로
 MenuItem s_next = null; // 앞으로
 MenuItem s_close = null; // 종료
 
 MenuItem help_m = null; //헬프 메뉴
 Menu help_s = null; // 헬프 메뉴 하위
 MenuItem hs_info = null;
 
 public nm_Frame() {
   // 생성자 영역
 }
 
 public void set_Design() { // 컴포넌트 배치 설정
  display = new Display();
  sh = new Shell(display);
  sh.setLayout(new FormLayout());
  sh.setLocation(10, 10);
  sh.setSize(1000,700);
  sh.setText("Swt&Java WebBrowser 0.01b");

  // 폰트설정 
  Font font = new Font(sh.getDisplay(), new FontData("SansSerif", 12, SWT.NORMAL));
   
  // 메뉴 세팅
  main_m = new Menu(sh, SWT.BAR); //메뉴바가 될 부분...
  sh.setMenuBar(main_m);
  file_m = new MenuItem(main_m, SWT.CASCADE); //파일메뉴
  file_m.setText("&FILE");
  file_s = new Menu(sh, SWT.DROP_DOWN);// 파일메뉴 하위...
  file_m.setMenu(file_s);
  s_update = new MenuItem(file_s, SWT.PUSH); //새로고침
  s_update.setText("Refresh");
  s_back = new MenuItem(file_s, SWT.PUSH); // 뒤로
  s_back.setText("Back");
  s_next = new MenuItem(file_s, SWT.PUSH); // 앞으로
  s_next.setText("Forward");
  s_close = new MenuItem(file_s, SWT.PUSH); // 종료
  s_close.setText("Close");
  help_m = new MenuItem(main_m, SWT.CASCADE); //헬프 메뉴
  help_m.setText("&HELP");
  help_s = new Menu(sh, SWT.DROP_DOWN); // 헬프 메뉴 하위
  help_m.setMenu(help_s);
  hs_info = new MenuItem(help_s, SWT.PUSH);  // 프로그램 정보
  hs_info.setText("Program Info");
 
 
  // 상단 url 및 관련 버튼 위치 설정을 잡기위한 컨터이너 위치 지정
  panel = new Composite(sh, SWT.NONE);
  FormData f_top = new FormData();
  f_top.top = new FormAttachment(0, 0);
     f_top.left = new FormAttachment(0, 0);
     f_top.right = new FormAttachment(100, 0);
     panel.setLayoutData(f_top);
  panel.setLayout(new FormLayout());
  //panel.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
  // 이전페이지 보기 버튼
  back = new Button(panel, SWT.PUSH);
  back.setText("뒤로가기");
  back.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
  FormData n_1 = new FormData();
  n_1.top = new FormAttachment(5,1);
  n_1.left = new FormAttachment(1,0);
  back.setLayoutData(n_1);
 
  // 앞에 페이지 보기 버튼
  next = new Button(panel, SWT.PUSH);
  next.setText("앞으로가기");
  next.setBackground(display.getSystemColor(SWT.COLOR_BLACK));
  next.setForeground(display.getSystemColor(SWT.COLOR_WHITE));
  FormData n_2 = new FormData();
  n_2.top = new FormAttachment(5,1);
  n_2.left = new FormAttachment(back,5);
  next.setLayoutData(n_2);
 
  // 주소 라벨
  name = new Label(panel, SWT.NONE);
  name.setText(" URL : ");
     name.setFont(font);
  FormData n_3 = new FormData();
  n_3.top = new FormAttachment(5,3);
  n_3.left = new FormAttachment(next,2);
  name.setLayoutData(n_3);
 
  // 주소 텍스트창
  url_t = new Text(panel, SWT.BORDER);
  url_t.setFont(font);
  FormData n_4 = new FormData();
  n_4.top = new FormAttachment(5,0);
  n_4.left = new FormAttachment(name,2);
  n_4.right = new FormAttachment(80,0);
  url_t.setLayoutData(n_4);
 
  // 중지 버튼....
  stop = new Button(panel, SWT.PUSH);
  stop.setText("중지하기");
  FormData n_5= new FormData();
  n_5.top = new FormAttachment(5,1);
  n_5.left = new FormAttachment(url_t,5);
  stop.setLayoutData(n_5);
 
  // 새로고침....
  update = new Button(panel, SWT.PUSH);
  update.setText("새로고침");
  FormData n_6= new FormData();
  n_6.top = new FormAttachment(5,1);
  n_6.left = new FormAttachment(stop,5);
  update.setLayoutData(n_6);
 
  // 여기까지 중간 영역 컴포넌트 배치....
 
  // 하단 영역 위치 지정
  pan_s = new Composite(sh, SWT.NONE);
  FormData f_sou = new FormData();
  f_sou.bottom = new FormAttachment(100, 0);
  f_sou.left = new FormAttachment(0, 0);
  f_sou.right = new FormAttachment(100, 0);
  pan_s.setLayoutData(f_sou);
  pan_s.setLayout(new FormLayout());
       // 현재 url 주소를 보기 위한 컴포넌트 위치 지정
     url_s = new Text(pan_s, SWT.NONE | SWT.BORDER);
     //url_s.setBackground(display.getSystemColor(SWT.COLOR_BLACK));
     //url_s.setForeground(display.getSystemColor(SWT.COLOR_WHITE));
     FormData s_sou1 = new FormData();
     s_sou1.top = new FormAttachment(5,3);
     s_sou1.left = new FormAttachment(0,0);
     s_sou1.right = new FormAttachment(80,0);
     url_s.setEditable(false);
     url_s.setLayoutData(s_sou1);
     // 페이지 표시 상태 표기 컴포넌트 위치 지정
     p_bar = new ProgressBar(pan_s, SWT.BOLD);
     p_bar.setBackground(display.getSystemColor(SWT.COLOR_DARK_GRAY));
     FormData s_sou2 = new FormData();
     s_sou2.top = new FormAttachment(5, 4);
     s_sou2.left = new FormAttachment(url_s, 20);
     p_bar.setLayoutData(s_sou2);
    
   
  // 중간 브라우저 영역 위치 지정
  brow = new Browser(sh, SWT.BORDER);
 
  FormData f_cen = new FormData();
  f_cen.top = new FormAttachment(panel);
  f_cen.bottom = new FormAttachment(pan_s);
     f_cen.left = new FormAttachment(0, 5);
     f_cen.right = new FormAttachment(99, 10);
     brow.setLayoutData(f_cen);
   
 
  loc_s = new Label(sh, SWT.NONE);
  loc_s.setBounds(410,670,400,20);
  url_t.setText("http://www.naver.com");
     brow.setUrl(url_t.getText());   
     //컴포넌트 위치 설정 여기까지 아래는 시스템 창 열기...
    
    
     sh.open(); // 쉘 오픈
     set_Event(); // 이벤트 등록 메소드 실행
     while (!sh.isDisposed()) {
       if (!display.readAndDispatch())
         display.sleep();
     }
     display.dispose();


 }
 

// 이벤트 등록 메소드 이벤트 관련한 부분은 전부 in-line class를 이용하였습니다.
 public void set_Event() {
  // 브라우저에서 링크 상태를 나타내주는 이벤트 등록
  brow.addStatusTextListener(new StatusTextListener() {
   public void changed(StatusTextEvent te) {
    url_s.setText(te.text);
   }
  });
  // 브라우저에서 페이지 로딩 상태 표기 이벤트 등록
  brow.addProgressListener(new ProgressListener() {
   public void changed(ProgressEvent pe) {
    if(pe.total != 0) {
     int per = pe.current * 100 / pe.total;
     p_bar.setSelection(per);
    }
   }
  
   public void completed(ProgressEvent pe) {
    p_bar.setSelection(0);
   }
  });
  // 브라우저내 현재 브라우저에서 표기하는 url주소 표기 이벤트 등록
  brow.addLocationListener(new LocationListener() {
   public void changed(LocationEvent le) {
    if(le.top) {
    
     url_t.setText(le.location!);
    }
   }
   public void changing(LocationEvent le) {
   
   }
  });
  // 브라우저가 표기하는 페이지에서 윈도우 닫기 스크립트가 있을경우 처리하기 위해 등록
  brow.addCloseWindowListener(new CloseWindowListener() {
   public void close(WindowEvent we) {
    Browser bw = (Browser)we.widget;
    Shell sl = bw.getShell();
    sl.close();
   }
  });
  // 브라우저내 오른쪽 버튼으로 새창 열기 하면 익스플로러가 아닌 SWT창으로 새창 열기
  brow.addOpenWindowListener(new OpenWindowListener() {
   public void open(WindowEvent we) {
    Shell n_sh = new Shell(display);
    n_sh.setText("New Window");
    n_sh.setLayout(new FillLayout());
    Browser n_br = new Browser(n_sh, SWT.NONE);
    we.browser = n_br;
    n_sh.open();
   }
  });
 
  // 각종 버튼들 이벤트 설정

  // 뒤로가기 버튼
  back.addSelectionListener(new SelectionAdapter(){
   public void widgetSelected(SelectionEvent se) {
          brow.back();
         
      }
  });
  // 앞으로가기 버튼
  next.addSelectionListener(new SelectionAdapter(){
   public void widgetSelected(SelectionEvent se) {
          brow.forward();
      }
  });
  // 뒤로가기 버튼
  stop.addSelectionListener(new SelectionAdapter(){
   public void widgetSelected(SelectionEvent se) {
          brow.stop();
      }
  });
  // 앞으로가기 버튼
  update.addSelectionListener(new SelectionAdapter(){
   public void widgetSelected(SelectionEvent se) {
          brow.refresh();
      }
  });
 
  // 주소 창에  주소 입력 후 엔터 버튼 누를경우 해당 사이트로 브라우저 영역 고침
  url_t.addKeyListener(new KeyAdapter() {
   public void keyPressed(KeyEvent ke) {
    if(ke.keyCode == 13) {
     brow.setUrl(url_t.getText());
    }
   }
  });
  // 여기서 부터 메소드끝날때까지는 메뉴 이벤트 처리 영역
  // refresh 메뉴
  s_update.addListener(SWT.Selection, new Listener() {
   public void handleEvent(Event ev) {
    brow.refresh();
   }
  });
  //back 메뉴
  s_back.addListener(SWT.Selection, new Listener() {
   public void handleEvent(Event ev) {
    brow.back();
   }
  });
  //next(forward) 메뉴
  s_next.addListener(SWT.Selection, new Listener() {
   public void handleEvent(Event ev) {
    brow.forward();
   }
  });
  //close 메뉴
  s_close.addListener(SWT.Selection, new Listener() {
   public void handleEvent(Event ev) {
    try {
     display.dispose();
    } catch(Exception ex) {}
   }
  });
  // 프로그램 정보 메뉴 이벤트 등록(관련하여 info 내용을 등록함...
  hs_info.addListener(SWT.Selection, new Listener() {
   public void handleEvent(Event ev) {
    try {
     Shell n_sh = new Shell(display);
     n_sh.setText("프로그램 정보 ");
     n_sh.setLayout(new FillLayout());
     Browser n_br = new Browser(n_sh, SWT.NONE);
     String e_text = "<html> <head> " +
     "<meta http-equiv=Content-Type content=\"text/html; charset=ks_c_5601-1987\">" +
     "<meta name=Generator content=\"Microsoft Word 10 (filtered)\">" +
     "<title>Swt&Java WebBrowser [ver</title>" +
                    "<style> <!--  /* Font Definitions */" +
                    "@font-face " +
                    "{font-family:바탕;panose-1:2 3 6 0 0 1 1 1 1 1;} @font-face {font-family:"+
                    "\"\\@바탕\"; panose-1:2 3 6 0 0 1 1 1 1 1;} " +
                    "/* Style Definitions */" +
                    "p.MsoNormal, li.MsoNormal, div.MsoNormal " +
                    " {margin:0cm; " +
                    " margin-bottom:.0001pt;  text-align:justify;  text-justify:inter-ideograph; " +
                    " text-autospace:none;  word-break:break-hangul;  font-size:10.0pt; " +
                    " font-family:바탕;} a:link, span.MsoHyperlink  {color:blue; " +
                    " text-decoration:underline;} a:visited, span.MsoHyperlinkFollowed " +
                    "  {color:purple;  text-decoration:underline;} " +
                    "/* Page Definitions */ " +
                    " @page Section1 " +
                    " {size:595.3pt 841.9pt; " +
                    " margin:99.25pt 55.3pt 3.0cm 3.0cm; "+
                    "layout-grid:18.0pt;} div.Section1  {page:Section1;} " +
                    "--> " +
                    " </style> </head> " +
                    "<body lang=KO link=blue vlink=purple> " +
                    "<div class=Section1 style='layout-grid:18.0pt'>" +
                    "<p ><b><span style='font-size:14.0pt;font-family:" +
                    "\"Courier New\";color:navy'>Swt&Java WebBrowser [ver. 0.01b]</span></b></p>"+

                     "<p ><span > </span></p> "+

"<p ><b><span style='font-size:12.0pt;color:#3366FF'>1. " +
" 프로그램 라이센스 정보</span></b></p>" +

"<p ><span >  @ 이 프로그램은 저작자의 동의없이 상업을 목적으로 판매 할 수 없습니다.</span></p>"+

"<p ><span >  @ 이 프로그램을 사용 하다 발생 되는 문제에 대해선 저작자가 책임지지 " +
"않습니다.</span></p>"+

"<p ><span >  @ 이 프로그램은 저작자의 Open Project 의 일환으로 제작된"+
"프로그램으로써</span></p> "+

"<p ><span >     소스코드를 공개 하는 바입니다.</span></p>"+

"<p style='margin-right:-4.0pt;text-indent:20.0pt'><span " +
" style='color:#FF6600'>(단! 이 프로그램의 기능을 이용한 프로그램 제작시 실행에 출처를 밝혀 주셔야 합니다.)</span></p>" +
"<p style='margin-right:-4.0pt'><span "+
"style='color:#FF6600'> </span></p>"+

"<p style='margin-right:-4.0pt'><b><span +
"style='font-size:12.0pt;color:#3366FF'>2. 프로그램에 관련하여 문의</span></b></p>"+

"<p style='margin-right:-4.0pt'><span "+
"style='color:#FF6600'>  </span><span >@ 저작자가 운영하는 블로그나 카페를 통해 문의"+
"하여 주시기 바랍니다.</span></p>"+

"<p style='margin-right:-4.0pt;text-indent:25.0pt'><span "+
"> 블로그 : <a href=\"http://blog.naver.com/ind4\">http://blog.naver.com/ind4</a> "+
" 카  페 : <a href=\"http://cafe.naver.com/tgof\">http://cafe.naver.com/tgof</a>"+
"</span></p>"+

"<p style='margin-right:-4.0pt'><span > </span></p> "+

"<p style='margin-right:-4.0pt'><b><span "+
"style='font-size:12.0pt;color:#3366FF'>3. 개발 후기</span></b></p>"+

"<p style='margin-right:-4.0pt;text-indent:10.0pt'><span "+
">@ 원래 순수 자바로만 제작할려고 했으나 저작자의 내공부족으로 시련을 겪다가 SWT라는</span></p>"+

"<p style='margin-right:-4.0pt;text-indent:10.0pt'><span"+
">   이클립스 plug-in을 발견하여 제작하게 되었습니다. SWT를 좀더 일찍 알았다면 좋았을</span></p>"+

"<p style='margin-right:-4.0pt;text-indent:10.0pt'><span"+
">   거라 생각하며 또 다른 프로그램을 제작 하러 오늘도 공부 하려 합니다.</span></p>"+

"</div> </body> </html> ";
     n_br.setText(e_text);
     n_sh.open();
    } catch(Exception ex) {}
   }
  });
 
 } // end of set_Event()
 
 public static void main(String args[]) { // 메인 메소드
  nm_Frame nm = new nm_Frame();
  nm.set_Design();
 
 }
}
 
 

출 처 : http://cafe.naver.com/tgof/208 (N 모사에 운영 되고 있는 내 카페)
 

반응형
Posted by onlyTheOne
,
반응형

네트워크 이야기에 써야 마땅할 ARP 프로토콜을 프로그래밍 이야기에 적으려 합니다.
제가 04년에 학과 과목 중 한 과목 텀 프로젝트로.....
만들었던 프로그램입니다.
ARP 프로토콜... 움직임을 네트워크 상에 표현한 소스 코드 입니다.
첫번째 소스 코드 입니다.

// eXtream.java ........................................................................

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.border.*;

import java.io.*;
import java.net.*;

/**
 * main class
 * class의 기능
 * 1. 패킷 이동 모습을 보여주는 것과
 * 2. 실제 C/S환경을 만들어 패킷을 전송하는것을 보여줌
 * 3. Server는 network의 회선을 지칭한다.
 * 4. Client는 network에 접속된 Computer로 지칭된다.
 */
public class eXtream extends JFrame implements Runnable, ActionListener {
  /**
   * // 사용자 정의 클래스 Object로 선언
   * 사용자 정의 class의 객체를 선언하는 부분
   */
  myObject my_ob = new myObject();
  myTable ta[] = new myTable[8];
  Network2 nt = new Network2();
  One_1 oe[] = new One_1[8];

//////////////////////////////////////////////////////////////////////
  // GUI Component 부분
  JPanel com1 = new JPanel();
  JPanel com2 = new JPanel();
  JPanel com3 = new JPanel();
  JPanel com4 = new JPanel();
  JPanel com5 = new JPanel();
  JPanel com6 = new JPanel();
  JPanel com7 = new JPanel();
  JPanel com8 = new JPanel();
  ImageIcon ic = new ImageIcon("bg.gif");
  ImageIcon con = new ImageIcon("icon.gif");
  JButton bu_init = new JButton();
  JLabel bg = new JLabel();
  JButton effect = new JButton();
  JButton bu_Kill = new JButton();

  Graphics g = null;
//////////////////////////////////////////////////////////////////
  int center_XY[][] = new int[17][2];
  int one_XY[][] = new int[5][2];
  int two_XY[][] = new int[5][2];
  int thd_XY[][] = new int[5][2];
  int fth_XY[][] = new int[5][2];

  String log_hard[][] = // IP주소와 MAC주소를 지정하였다.
      {{"130.23.43.20","B23455102210"}, {"130.23.43.21", "46EF45983AB"},
      {"130.23.43.22","A23EF5510210"}, {"130.23.43.23", "BA021434EECD"},
      {"130.23.43.24","B4512340113"}, {"130.23.53.25","CEFE4213420"},
      {"130.23.43.25","B2345522110"}, {"130.23.43.26","46FE45938BA"}
  };

  int th_type = 0;  // thread 돌아갈때 애니메이션의 어느부분인가 지정하는것
  Thread th = null; // Thread 객체 선언....

  GridLayout gridLayout1 = new GridLayout();
  JButton bu1_com1 = new JButton();
  JButton bu2_com1 = new JButton();
  JLabel jLabel1 = new JLabel();
  JButton bu1_com2 = new JButton();
  JButton bu2_com2 = new JButton();
  JLabel jLabel2 = new JLabel();
  GridLayout gridLayout2 = new GridLayout();
  GridLayout gridLayout3 = new GridLayout();
  JButton bu1_com3 = new JButton();
  JButton bu2_com3 = new JButton();
  JLabel jLabel3 = new JLabel();
  GridLayout gridLayout4 = new GridLayout();
  JButton bu1_com4 = new JButton();
  JButton bu2_com4 = new JButton();
  JLabel jLabel4 = new JLabel();
  GridLayout gridLayout5 = new GridLayout();
  JButton bu1_com5 = new JButton();
  JButton bu2_com5 = new JButton();
  JLabel jLabel5 = new JLabel();
  GridLayout gridLayout6 = new GridLayout();
  JButton bu1_com6 = new JButton();
  JButton bu2_com6 = new JButton();
  JLabel jLabel6 = new JLabel();
  GridLayout gridLayout7 = new GridLayout();
  GridLayout gridLayout8 = new GridLayout();
  JButton bu1_com7 = new JButton();
  JButton bu2_com7 = new JButton();
  JLabel jLabel7 = new JLabel();
  JButton bu1_com8 = new JButton();
  JButton bu2_com8 = new JButton();
  JLabel jLabel8 = new JLabel();
  TitledBorder titledBorder1;

  /**
   * 생성자 Design 설정 메소드를 호출한다.
   */
  public eXtream() {
    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }

  public static void main(String[] args) {
    eXtream eXtream = new eXtream();
  }
  /**
   * jbInit() Design을 설정하는 메소드
   * @throws java.lang.Exception
   */
  private void jbInit() throws Exception {
    titledBorder1 = new TitledBorder("");
    this.getContentPane().setBackground(Color.white);
    this.setResizable(false);
    this.setState(Frame.NORMAL);
    this.setTitle("ARP Emulator");
    this.getContentPane().setLayout(null);
    com1.setBackground(Color.lightGray);
    com1.setBorder(BorderFactory.createRaisedBevelBorder());
    com1.setBounds(new Rectangle(21, 28, 67, 57));
    com1.setLayout(gridLayout1);
    com2.setBackground(Color.lightGray);
    com2.setBorder(BorderFactory.createRaisedBevelBorder());
    com2.setBounds(new Rectangle(125, 28, 67, 57));
    com2.setLayout(gridLayout2);
    com3.setBackground(Color.lightGray);
    com3.setBorder(BorderFactory.createRaisedBevelBorder());
    com3.setBounds(new Rectangle(233, 28, 67, 57));
    com3.setLayout(gridLayout3);
    com4.setBackground(Color.lightGray);
    com4.setBorder(BorderFactory.createRaisedBevelBorder());
    com4.setBounds(new Rectangle(346, 28, 67, 57));
    com4.setLayout(gridLayout4);
    com5.setBackground(Color.lightGray);
    com5.setBorder(BorderFactory.createRaisedBevelBorder());
    com5.setBounds(new Rectangle(21, 186, 67, 57));
    com5.setLayout(gridLayout5);
    com6.setBackground(Color.lightGray);
    com6.setBorder(BorderFactory.createRaisedBevelBorder());
    com6.setBounds(new Rectangle(125, 186, 67, 57));
    com6.setLayout(gridLayout6);
    com7.setBackground(Color.lightGray);
    com7.setBorder(BorderFactory.createRaisedBevelBorder());
    com7.setBounds(new Rectangle(233, 186, 67, 57));
    com7.setLayout(gridLayout7);
    com8.setBackground(Color.lightGray);
    com8.setBorder(BorderFactory.createRaisedBevelBorder());
    com8.setBounds(new Rectangle(346, 186, 67, 57));
    com8.setLayout(gridLayout8);
    bu_init.setBounds(new Rectangle(421, 27, 84, 66));
    bu_init.setFont(new java.awt.Font("SansSerif", 0, 12));
    bu_init.setMargin(new Insets(0, 0, 0, 0));
    bu_init.setText("System Init");
    bg.setBackground(Color.white);
    bg.setOpaque(true);
    bg.setBounds(new Rectangle(49, 85, 342, 101));
    effect.setBounds(new Rectangle(421, 175, 84, 66));
    effect.setEnabled(false);
    effect.setFont(new java.awt.Font("SansSerif", 0, 12));
    effect.setMargin(new Insets(0, 0, 0, 0));
    effect.setText("효과가동");
    bu_Kill.setBounds(new Rectangle(421, 101, 84, 66));
    bu_Kill.setFont(new java.awt.Font("SansSerif", 0, 12));
    bu_Kill.setMargin(new Insets(0, 0, 0, 0));
    bu_Kill.setText("System Term.");
    bu1_com1.setFont(new java.awt.Font("SansSerif", 0, 12));
    bu1_com1.setMargin(new Insets(0, 0, 0, 0));
    bu1_com1.setText("정보보기");
    gridLayout1.setRows(3);
    bu2_com1.setFont(new java.awt.Font("SansSerif", 0, 12));
    bu2_com1.setMargin(new Insets(0, 0, 0, 0));
    bu2_com1.setText("ARP요청");
    jLabel1.setText("Com1");
    bu1_com2.setText("정보보기");
    bu1_com2.setMargin(new Insets(0, 0, 0, 0));
    bu1_com2.setFont(new java.awt.Font("SansSerif", 0, 12));
    bu2_com2.setText("ARP요청");
    bu2_com2.setMargin(new Insets(0, 0, 0, 0));
    bu2_com2.setFont(new java.awt.Font("SansSerif", 0, 12));
    jLabel2.setToolTipText("");
    jLabel2.setText("Com2");
    gridLayout2.setRows(3);
    gridLayout3.setRows(3);
    bu1_com3.setText("정보보기");
    bu1_com3.setMargin(new Insets(0, 0, 0, 0));
    bu1_com3.setFont(new java.awt.Font("SansSerif", 0, 12));
    bu2_com3.setText("ARP요청");
    bu2_com3.setMargin(new Insets(0, 0, 0, 0));
    bu2_com3.setFont(new java.awt.Font("SansSerif", 0, 12));
    jLabel3.setText("Com3");
    gridLayout4.setRows(3);
    bu1_com4.setText("정보보기");
    bu1_com4.setMargin(new Insets(0, 0, 0, 0));
    bu1_com4.setFont(new java.awt.Font("SansSerif", 0, 12));
    bu2_com4.setText("ARP요청");
    bu2_com4.setMargin(new Insets(0, 0, 0, 0));
    bu2_com4.setFont(new java.awt.Font("SansSerif", 0, 12));
    jLabel4.setText("Com4");
    jLabel4.setVerticalAlignment(SwingConstants.CENTER);
    jLabel4.setVerticalTextPosition(SwingConstants.CENTER);
    gridLayout5.setRows(3);
    bu1_com5.setText("정보보기");
    bu1_com5.setMargin(new Insets(0, 0, 0, 0));
    bu1_com5.setFont(new java.awt.Font("SansSerif", 0, 12));
    bu2_com5.setText("ARP요청");
    bu2_com5.setMargin(new Insets(0, 0, 0, 0));
    bu2_com5.setFont(new java.awt.Font("SansSerif", 0, 12));
    jLabel5.setText("Com5");
    gridLayout6.setRows(3);
    bu1_com6.setText("정보보기");
    bu1_com6.setMargin(new Insets(0, 0, 0, 0));
    bu1_com6.setFont(new java.awt.Font("SansSerif", 0, 12));
    bu2_com6.setText("ARP요청");
    bu2_com6.setMargin(new Insets(0, 0, 0, 0));
    bu2_com6.setFont(new java.awt.Font("SansSerif", 0, 12));
    jLabel6.setForeground(Color.black);
    jLabel6.setText("Com6");
    bu1_com7.setText("정보보기");
    bu1_com7.setMargin(new Insets(0, 0, 0, 0));
    bu1_com7.setFont(new java.awt.Font("SansSerif", 0, 12));
    bu2_com7.setText("ARP요청");
    bu2_com7.setMargin(new Insets(0, 0, 0, 0));
    bu2_com7.setFont(new java.awt.Font("SansSerif", 0, 12));
    jLabel7.setText("Com7");
    bu1_com8.setText("정보보기");
    bu1_com8.setMargin(new Insets(0, 0, 0, 0));
    bu1_com8.setFont(new java.awt.Font("SansSerif", 0, 12));
    bu2_com8.setText("ARP요청");
    bu2_com8.setMargin(new Insets(0, 0, 0, 0));
    bu2_com8.setFont(new java.awt.Font("SansSerif", 0, 12));
    jLabel8.setText("Com8");
    gridLayout8.setRows(3);
    gridLayout7.setRows(3);
    this.getContentPane().add(com1, null);
    com1.add(jLabel1, null);
    com1.add(bu1_com1, null);
    com1.add(bu2_com1, null);
    this.getContentPane().add(com4, null);
    this.getContentPane().add(com3, null);
    this.getContentPane().add(com2, null);
    this.getContentPane().add(com6, null);
    this.getContentPane().add(com7, null);
    this.getContentPane().add(com8, null);
    this.getContentPane().add(com5, null);
    this.getContentPane().add(bg, null);
    com3.add(jLabel3, null);
    com4.add(jLabel4, null);
    com4.add(bu1_com4, null);
    com4.add(bu2_com4, null);
    com2.add(jLabel2, null);
    com2.add(bu1_com2, null);
    com2.add(bu2_com2, null);
    com3.add(bu1_com3, null);
    com3.add(bu2_com3, null);
    com5.add(jLabel5, null);
    com6.add(jLabel6, null);
    com7.add(jLabel7, null);
    com7.add(bu1_com7, null);
    com7.add(bu2_com7, null);
    com8.add(jLabel8, null);
    com8.add(bu1_com8, null);
    com8.add(bu2_com8, null);
    com5.add(bu1_com5, null);
    com5.add(bu2_com5, null);
    com6.add(bu1_com6, null);
    com6.add(bu2_com6, null);
    this.getContentPane().add(bu_init, null);
    this.getContentPane().add(bu_Kill, null);
    this.getContentPane().add(effect, null);
    this.setSize(new Dimension(530, 281));
    this.setVisible(true);

    g = bg.getGraphics();
    conXY();
    addEvent(); // GUI 컴포넌트 Event 등록용 메소드
  }
  /**
   * GUI component의 Event를 시스템에 등록시키는 메소드
   */
  private void addEvent() {
   bu_init.addActionListener(this);
   effect.addActionListener(this);
   bu_Kill.addActionListener(this);

   bu1_com1.addActionListener(this);
   bu2_com1.addActionListener(this);
   bu1_com2.addActionListener(this);
   bu2_com2.addActionListener(this);
   bu1_com3.addActionListener(this);
   bu2_com3.addActionListener(this);
   bu1_com4.addActionListener(this);
   bu2_com4.addActionListener(this);
   bu1_com5.addActionListener(this);
   bu2_com5.addActionListener(this);
   bu1_com6.addActionListener(this);
   bu2_com6.addActionListener(this);
   bu1_com7.addActionListener(this);
   bu2_com7.addActionListener(this);
   bu1_com8.addActionListener(this);
   bu2_com8.addActionListener(this);
   my_ob.bu_ok.addActionListener(this);
   my_ob.bu_cancel.addActionListener(this);

 }
 /**
  * ActionEvent를 처리 하기 위한 메소드로써 ActionEvent 객체를 parameter값으로 받아온다.
  * @param ev ActionEvent
  */
 public void actionPerformed(ActionEvent ev) {
   Object ob = ev.getSource();
   if(ob == bu_init){
     set_Network();
     setImage();
     bu_init.setEnabled(false);
   }
   if(ob == bu_Kill) {
     try {
       this.setVisible(false);
       System.exit(0);
     } catch(Exception ex) {}

   }
   if(ob == effect) {

   }
   if(ob == bu1_com1) {  show_Table(0); }
   if(ob == bu1_com2) {  show_Table(1); }
   if(ob == bu1_com3) {  show_Table(2); }
   if(ob == bu1_com4) {  show_Table(3); }
   if(ob == bu1_com5) {  show_Table(4); }
   if(ob == bu1_com6) {  show_Table(5); }
   if(ob == bu1_com7) {  show_Table(6); }
   if(ob == bu1_com8) {  show_Table(7); }

   if(ob == bu2_com1) {  show_Arp(0);  }
   if(ob == bu2_com2) {  show_Arp(1);  }
   if(ob == bu2_com3) {  show_Arp(2);  }
   if(ob == bu2_com4) {  show_Arp(3);  }
   if(ob == bu2_com5) {  show_Arp(4);  }
   if(ob == bu2_com6) {  show_Arp(5);  }
   if(ob == bu2_com7) {  show_Arp(6);  }
   if(ob == bu2_com8) {  show_Arp(7);  }

   if(ob == my_ob.bu_cancel) {
     if(my_ob.isVisible() == true) {
       my_ob.tf_ip.setText("");
       my_ob.setVisible(false);

     }
   }
   if(ob == my_ob.bu_ok) {
     arp_Request(my_ob.get_ProcessNum()); //arp 요청
     my_ob.tf_ip.setText("");
     my_ob.setVisible(false);
   }

   if(ob == ta[0].bu_update) { update_Table(0); }
   if(ob == ta[1].bu_update) { update_Table(1); }
   if(ob == ta[2].bu_update) { update_Table(2); }
   if(ob == ta[3].bu_update) { update_Table(3); }
   if(ob == ta[4].bu_update) { update_Table(4); }
   if(ob == ta[5].bu_update) { update_Table(5); }
   if(ob == ta[6].bu_update) { update_Table(6); }
   if(ob == ta[7].bu_update) { update_Table(7); }


 }

 /**
  * ARP 에뮬레이팅을 위한 네트워크 환경 구축용 메소드
  */
 private void set_Network() {
   nt.servStart();
   for(int i=0;i<8;i++) {
     ta[i] = new myTable();
     ta[i].set_IP(log_hard[i][0]);
     ta[i].set_Mac(log_hard[i][1]);
     ta[i].bu_update.addActionListener(this);
     oe[i] = new One_1();
     oe[i].connProcess(log_hard[i][0],log_hard[i][1]);
     oe[i].set_Num(i);
   }
 }
 /**
  * Table을 Update시키게 하는 메소드
  * @param num table이 몇번인지 파악한다.
  */
 private void update_Table(int num) {
   ta[num].validate();
 }

 /**
  * Table Frame을 사용자에게 보여주는 메소드
  * @param num Table의 몇번인지 파악한다.
  */
 private void show_Table(int num) {
   ta[num].setVisible(true);
 }

 /**
  * arp요청시 필요한 IP정보를 받아오기 위한 메소드
  * @param pid 몇번째 Table에서 요청하는지 파악하지 위한 값전달
  */
  private synchronized void show_Arp(int pid) {
   my_ob.setLocation(400,300);
   my_ob.set_ProcessNum(pid);
   my_ob.setVisible(true);
 }
 /**
  * ARP를 요청 하여 처리
  * @param i 몇번째 Client에서 요청하였는지 파악하는 인수값
  */
 private void arp_Request(int i) {
   String ip = my_ob.tf_ip.getText().trim();
   boolean tf = ta[i].isIpRow(ip);
   if(tf == false) {
     String temp = ta[i].get_State(ip);
     if(temp == "R") {// resolved 상태이면
       JOptionPane.showMessageDialog(this,"이미 Table에 해당 ip에 대한 mac이 등록되어 있습니다.");
     } else if(temp == "P") {
       JOptionPane.showMessageDialog(this,"Physical address를 기다리는중입니다. 잠시만 기다리세요");
     }
   } else {
     int proc_num = my_ob.get_ProcessNum();
     oe[i].sendProcess(ip);
   }
 }

 /**
  * 5개의 배열에 초기값을 저장하는 메소드
  */
  private void conXY() {
    int i;
    for(i=0;i<17;i++) {
      center_XY[i][1] = 41;
    }
    center_XY[0][0] = 1;
    for(i=1;i<17;i++) {
      center_XY[i][0] = 1 + (20 * i);
    }
    for(i=0;i<5;i++) {
      one_XY[i][0] = 1;
      two_XY[i][0] = 101;
      thd_XY[i][0] = 221;
      fth_XY[i][0] = 321;
    }
    one_XY[0][1] = 1;
    two_XY[0][1] = 1;
    thd_XY[0][1] = 1;
    fth_XY[0][1] = 1;
    for(i=1;i<5;i++) {
      one_XY[i][1] = 1 + (20 * i);
      two_XY[i][1] = 1 + (20 * i);
      thd_XY[i][1] = 1 + (20 * i);
      fth_XY[i][1] = 1 + (20 * i);
    }
  }

  /**
   * 애니메이션 효과를 위한 배경 이미지 삽입
   *
   * */
  public void setImage() {
    bg.setIcon(ic);
  }

  /**
   *  i번 computer에서 전체로 broadCasting할때 패킷 보여주는것
   * @param i 몇 번째 가상 client에서 broadcasting하는 알려주기 위한것
   */
  public void show_All(int i) {
    switch(i) {
      case 1: one_to_All(); break;
      case 2: two_to_All(); break;
      case 3: thd_to_All(); break;
      case 4: fth_to_All(); break;
      case 5: fiv_to_All(); break;
      case 6: six_to_All(); break;
      case 7: sev_to_All(); break;
      case 8: egh_to_All(); break;
    }
  }
  /**
   * 1번에서 Broadcasting 할때
   */
  public void one_to_All() {
    one_1();
    one_2();
    one_3();
    one_4();
  } // end of one_to_All();
  /**
   * 5번에서 broadCasting 할때
   */
  public void fiv_to_All() {
    one_other();
    one_2();
    one_3();
    one_4();
  } // end of fiv_to_All()
  /**
   * 4번에서 broadCasting 할때
   */
  public void fth_to_All() {
    two_1();
    two_2();
    two_3();
    two_4();
  } // end of fth_to_All()
  /**
   * 8번에서 broadcasting 할때
   */
  public void egh_to_All() {
    two_other();
    two_2();
    two_3();
    two_4();
  } // end of egh_to_All()
  /**
   * 2번에서 BroadCasting시...
   */
  public void two_to_All() {
    // 왼쪽과 아래에 위치한 Computer로  패킷으로 전송
    two_move2();
    try {
      Thread.sleep(100);
    } catch(Exception ex) {}
    second_th(8);
    th = new Thread(this);
    th_type = 23;
    th.start();
    try {
      Thread.sleep(400);
    } catch(Exception ex) {}
    two_4();
  // 아래로 내려와 오른쪽에 위치한 Computer로 패킷으로 전송
    try {
      Thread.sleep(100);
    } catch(Exception ex) {}
    two_move2();
    try {
      Thread.sleep(100);
    } catch(Exception ex) {}
    second_th(3);
    try {
      Thread.sleep(500);
    } catch(Exception ex) {}
    one_3();
    one_4();
  } // end of two_to_All()
  /**
   * 6번에서 BroadCasting할 경우
   */
  public void six_to_All() {
    // 왼쪽과 위에 위치한 Computer로  패킷으로 전송
    two_move5();
    try {
      Thread.sleep(100);
    } catch(Exception ex) {}
    second_th(8);
    th = new Thread(this);
    th_type = 26;
    th.start();
    try {
      Thread.sleep(400);
    } catch(Exception ex) {}
    two_4();
  // 위로 올라가 오른쪽에 위치한 Computer로 패킷으로 전송
    try {
      Thread.sleep(100);
    } catch(Exception ex) {}
    two_move5();
    try {
      Thread.sleep(100);
    } catch(Exception ex) {}
    second_th(3);
    try {
      Thread.sleep(500);
    } catch(Exception ex) {}
    one_3();
    one_4();
  } // end of six_to_All();
  /**
   * 3번에서 BroadCasting 할경우
   */
  public void thd_to_All() {
    // 왼쪽과 아래에 위치한 Computer로  패킷으로 전송
    thd_move2();
    try {
      Thread.sleep(100);
    } catch(Exception ex) {}
    second_th(7);
    th = new Thread(this);
    th_type = 33;
    th.start();
    try {
      Thread.sleep(400);
    } catch(Exception ex) {}
    two_3();
    two_4();
  // 아래로 내려와 오른쪽에 위치한 Computer로 패킷으로 전송
    try {
      Thread.sleep(100);
    } catch(Exception ex) {}
    thd_move2();
    try {
      Thread.sleep(100);
    } catch(Exception ex) {}
    second_th(4);
    try {
      Thread.sleep(500);
    } catch(Exception ex) {}

    one_4();
  } // end of thd_to_All()
  /**
   * 7번에서 BroadCasting을 할경우
   */
  public void sev_to_All() {
    // 왼쪽과 아래에 위치한 Computer로  패킷으로 전송
    thd_move5();
    try {
      Thread.sleep(100);
    } catch(Exception ex) {}
    second_th(7);
    th = new Thread(this);
    th_type = 36;
    th.start();
    try {
      Thread.sleep(400);
    } catch(Exception ex) {}
    two_3();
    two_4();
  // 아래로 내려와 오른쪽에 위치한 Computer로 패킷으로 전송
    try {
      Thread.sleep(100);
    } catch(Exception ex) {}
    thd_move5();
    try {
      Thread.sleep(100);
    } catch(Exception ex) {}
    second_th(4);
    try {
      Thread.sleep(500);
    } catch(Exception ex) {}

    one_4();

  }
  /**
   * 4번에서 broadCasting 할때 기본 설정
   */
  public void two_1() { //
    fth_move2();
    second_th(6);
    time_move(43);
  }
  /**
   * 8번에서 broadCasting 할때는 위에 있는 two_1()의 메소드의 일부만 수정사용
   */
  public void two_other() {
    fth_move5();
    second_th(6);
    time_move(46);
  }
  /** 애니메이션 효과를 위한 메소드
   * ↑
   * ←   // 이런식으로 움직임을 보여주는 메소드
   * ↓    // 아래에 있는 two_3(), two_4() 메소드도 같은 역할을 한다.
   */
  public void two_2() {
    try {
      Thread.sleep(400);
    } catch(Exception ex) {}
    second_th(7);
    th = new Thread(this);
    th_type = 36;
    th.start();
    time_move(33);
  }
  public void two_3() {
    try {
      Thread.sleep(400);
    } catch(Exception ex) {}
    second_th(8);
    th = new Thread(this);
    th_type = 26;
    th.start();
    time_move(23);
  }
  public void two_4() {
    try {
      Thread.sleep(400);
    } catch(Exception ex) {}
    th = new Thread(this);
    th_type = 16;
    th.start();
    time_move(13);
  }
  /**
   * 1번 시작 할때 첫번째 이동 메소드
   */
  public void one_1() { //
    one_move2();
    second_th(2);
    time_move(13);
  }
  /**
   * 1번 아래 있는 5번에서 시작할때 첫번째 이동 메소드
   */
  public void one_other() { //
    one_move5();
    second_th(2);
    time_move(16);
  }
  /**
   * 위에 있는 two_x메소드와 반대방향 → 이런식으로 패킷을 보내는 기능을 가진 메소드
   */
  public void one_2() {
    try {
      Thread.sleep(300);
    } catch(Exception ex) {}

    th = new Thread(this);
    th_type = 23;
    th.start();

    second_th(3);
    time_move(26);
  }
  /**
   * 위의 one_2()의 오른쪽으로 한블럭이동된 곳에서 시작한다.
   */
  public void one_3() {
    try {
      Thread.sleep(300);
    } catch(Exception ex) {}

    th = new Thread(this);
    th_type = 33;
    th.start();

    second_th(4);
    time_move(36);
  }
  /**
   * one_3에서 오른쪽 방향으로 진행하는 패킷 이동 효과용 메소드
   *
   */
  public void one_4() {
    try {
      Thread.sleep(300);
    } catch(Exception ex) {}
    th = new Thread(this);
    th_type = 43;
    th.start();

    time_move(46);
  }

  /**
   * Second_th 메소드는 Second Thread를 이용하기 위한 메소드
   * @param i i번째 Thread를 시작하기 위해서 지정
   */
  private void second_th(int i) {
    Second se = new Second(i);
    se.start();
  }
  /**
   * 두번째 Thread로 애니메이션 효과를 위해 만든 것으로
   * inner class로 구현하였다.
   */
  class Second extends Thread {
    int i;
    Second(int item) {
      i = item;
    }
    public void run() {
      try {
        Thread.sleep(25);
      } catch(Exception ex) {}
      if(i == 2) {         run_case2(); // 왼쪽에서 오른쪽 1번 메소드
      } else if(i == 3) {  run_case3(); //               2번 메소드
      } else if(i == 4) {  run_case4(); //               3번 메소드
      } else if(i == 6) {  run_case6(); // 오른쪽에서 왼쪽 1번 메소드
      } else if(i == 7) {  run_case7(); //               2번 메소드
      } else if(i == 8) {  run_case8(); //               3번 메소드
      }
    }
  }

  /**
   * TimerTack를 상속 받아온 inner class로...
   * 애니메이션 효과를 위해서 Thread와 유사한 TimerTask를 이용하여 제작함
   *
   */
  class Timer extends TimerTask {
    int i = 1;
    Timer(int i) {
      this.i = i;
    }
    public void run() {
      try {
        Thread.sleep(25);
      } catch(Exception ex) {}
      if(i == 12) {        one_move2();
      } else if(i == 13) { one_move3();
      } else if(i == 15) { one_move5();
      } else if(i == 16) { one_move6();
      } else if(i == 22) { two_move2();
      } else if(i == 23) { two_move3();
      } else if(i == 25) { two_move5();
      } else if(i == 26) { two_move6();
      } else if(i == 32) { thd_move2();
      } else if(i == 33) { thd_move3();
      } else if(i == 35) { thd_move5();
      } else if(i == 36) { thd_move6();
      } else if(i == 42) { fth_move2();
      } else if(i == 43) { fth_move3();
      } else if(i == 45) { fth_move5();
      } else if(i == 46) { fth_move6();
      }
    }
  }
  /**
   * 위에 있는 Timer 클래스를 사용하기 위한 메소드임
   * @param in in의 값의 timer를 실행할건지 결정하기 위해서
   */
  private void time_move(int in) {
    Timer ti = new Timer(in);
    ti.run();
  }

  public synchronized void run() {
    try { // 다른 스레드 또는 TimerTask랑 속도를 맞추기 위해 sleep을 건다.
      Thread.sleep(25);
    } catch(Exception ex) {}

    if(th_type == 9) {
      if(th_type == 1) {         run_case1();
      } else if(th_type == 2) {  run_case2();
      } else if(th_type == 3) {  run_case3();
      } else if(th_type == 4) {  run_case4();
      } else if(th_type == 5) {  run_case5();
      } else if(th_type == 6) {  run_case6();
      } else if(th_type == 7) {  run_case7();
      } else if(th_type == 8) {  run_case8();
      }
    } else if((th_type > 10) && (th_type < 20)) {
      if(th_type == 11) {        one_move1();
      } else if(th_type == 12) { one_move2();
      } else if(th_type == 13) { one_move3();
      } else if(th_type == 14) { one_move4();
      } else if(th_type == 15) { one_move5();
      } else if(th_type == 16) { one_move6();
      }
    } else if((th_type > 20) && (th_type < 30)) {
      if(th_type == 21) {        two_move1();
      } else if(th_type == 22) { two_move2();
      } else if(th_type == 23) { two_move3();
      } else if(th_type == 24) { two_move4();
      } else if(th_type == 25) { two_move5();
      } else if(th_type == 26) { two_move6();
      }
    } else if((th_type > 30) && (th_type < 40)) {
      if(th_type == 31) {        thd_move1();
      } else if(th_type == 32) { thd_move2();
      } else if(th_type == 33) { thd_move3();
      } else if(th_type == 34) { thd_move4();
      } else if(th_type == 35) { thd_move5();
      } else if(th_type == 36) { thd_move6();
      }
    } else if((th_type > 40) && (th_type < 50)) {
      if(th_type == 41) {        fth_move1();
      } else if(th_type == 42) { fth_move2();
      } else if(th_type == 43) { fth_move3();
      } else if(th_type == 44) { fth_move4();
      } else if(th_type == 45) { fth_move5();
      } else if(th_type == 46) { fth_move6();
      }
    }

  } // end of run();

  /**
   *  패킷 이동을 보여 주기 위한 애니메이션 효과 처리 부분 으로
   *  run_case'X'()메소드들은 부분별 효과를 담당하고 있다.('X'는 숫자)
   */

  /**
   * run_case1()은 왼쪽에서 오른쪽으로 이동하는 효과
   */
  private void run_case1() {
    run_case2();
    run_case3();
    run_case4();
  }
  private void run_case2() { move_Process(0,6,1,5);   }
  private void run_case3() { move_Process(5,12,1,5);  }
  private void run_case4() { move_Process(11,17,1,5); }

  /**
   * run_case5는 오른쪽에서 왼쪽으로 이동하는 효과
   */
  private void run_case5() {
    run_case6();
    run_case7();
    run_case8();
  }
  private void run_case6() { move_Process(16,11,2,5); }
  private void run_case7() { move_Process(11,5,2,5);  }
  private void run_case8() { move_Process(5,0,2,5);   }
  // one_moveX() 시리즈 메소드는 맨 왼쪽에 위치한 패킷 이동지역의 이동을 담당한다.
  private void one_move1() {
    one_move2();
    one_move3();
  }
  // one_move1,2,3 메소드는 위에서 아래 방향으로
  private void one_move2() { move_Process(0,3,1,1);   }
  private void one_move3() { move_Process(2,5,1,1);   }
  // one_move4,5,6 메소드는 아래에서 윗 방향으로 ...
  private void one_move4() {
    one_move5();
    one_move6();
  }
  private void one_move5() { move_Process(4,2,2,1);   }
  private void one_move6() { move_Process(2,0,2,1);   }

  // one_moveX()와 같다.. 왼쪽에서 2번째 위치한 패킷 움직임을 지정하기 위한 메소드
  private void two_move1() { // 위에서 아래로
    two_move2();
    two_move3();
  }
  private void two_move2() { move_Process(0,3,1,2);   }
  private void two_move3() { move_Process(2,5,1,2);   }
  // 아래에서 위로...
  private void two_move4() {
    two_move5();
    two_move6();
  }
  private void two_move5() { move_Process(4,2,2,2);   }
  private void two_move6() { move_Process(2,0,2,2);   }

  // thd_move1() 오른쪽에서 2번째 위치한 수직 패킷 이동 처리용 메소드
  private void thd_move1() { // 위에서 아래로 내려가는 처리뿐이다.
    thd_move2();
    thd_move3();
  }
  private void thd_move2() { move_Process(0,3,1,3);   }
  private void thd_move3() { move_Process(2,5,1,3);   }
  // 아래에서 위로 올라가는 처리만
  private void thd_move4() {
    thd_move5();
    thd_move6();
  }
  private void thd_move5() { move_Process(4,2,2,3);   }
  private void thd_move6() { move_Process(2,0,2,3);   }

  // 맨 오른쪽 수직 패킷 이동 처리를 위한 메소드
  // 1~3번까지는 위에서 아래로
  // 4~6번은 아래에서 위로 처리 한다.
  private void fth_move1() {
    fth_move2();
    fth_move3();
  }
  private void fth_move2() { move_Process(0,3,1,4);   }
  private void fth_move3() { move_Process(2,5,1,4);   }
  private void fth_move4() {
    fth_move5();
    fth_move6();
  }
  private void fth_move5() { move_Process(4,2,2,4);   }
  private void fth_move6() { move_Process(2,0,2,4);   }

  /**
   * move_Process()는 애니메이션 효과의 핵심 부분으로 효과를 담당
   * 총 5개의 parameter가 있는데 array_num에 해당하는 array의 start 번지부터
   * stop 번지까지 type에 따라 효과를 보여준다.
   * @param start 배열의 시작 번지
   * @param stop 배열의 마지막 번지
   * @param type 효과의 진행 방향 1은 왼쪽->오른쪽, 2는 오른쪽->왼쪽
   * array 가 center를 제외한 나머지의 경우 1은 위->아래, 2는 아래->위 이다.
   * @param array_num 해당 배열
   */
  private void move_Process(int start, int stop, int type, int array_num) {
    int array[][] = null;
    switch(array_num) {
      case 1: { array = one_XY; } break;
      case 2: { array = two_XY; } break;
      case 3: { array = thd_XY; } break;
      case 4: { array = fth_XY; } break;
      case 5: { array = center_XY; } break;
    }
    if(type == 1) {
      for (int i = start; i < stop; i++) {
        g.setColor(Color.GRAY);
        g.fillRect(array[i][0], array[i][1], 19, 19);
        if (i > 0) {
          g.setColor(Color.WHITE);
          g.fillRect(array[i - 1][0], array[i - 1][1], 19, 19);
        }
        try {
          Thread.sleep(150);
        } catch (InterruptedException ex) {}
      }
      g.setColor(Color.WHITE);
      g.fillRect(array[stop - 1][0], array[stop - 1][1], 19, 19);
    } else {
      for (int i = start; i > (stop-1); i--) {
        g.setColor(Color.GRAY);
        g.fillRect(array[i][0], array[i][1], 19, 19);
        if(array_num != 5) {
          if(i < 4) {
            g.setColor(Color.WHITE);
            g.fillRect(array[i + 1][0], array[i + 1][1], 19, 19);
          }
        } else {
          if(i < 16) {
            g.setColor(Color.WHITE);
            g.fillRect(array[i + 1][0], array[i + 1][1], 19, 19);
          }
        }
        try {
          Thread.sleep(150);
        } catch (InterruptedException ex) {}
      }
      g.setColor(Color.WHITE);
      g.fillRect(array[stop][0], array[stop][1], 19, 19);
    }
  }

  /**
   * uniCasting() 기능은 process to process로 패킷이 이동하는걸 보여주기 위해
   * 경우의 수에 따른 이동경로를 지정해 준 메소드로
   * start와 stop process를 지정해 주면 해당 경우에 따라 패킷이 이동한다.
   * @param start 시작 process의 번호
   * @param stop 도착 지점의 process의 번호
   */
  public void uniCasting(int start, int stop) {
    if(start == 1) {
      one_move2();
      if (stop == 2 || stop == 6) {
        run_case2();
        if(stop == 2) two_move6();
        else two_move3();
      } else if(stop == 3 || stop == 7) {
        run_case2(); run_case3();
        if(stop == 3) thd_move6();
        else thd_move3();
      } else if(stop == 4 || stop == 8) {
        run_case1();
        if(stop == 4) fth_move6();
        else fth_move3();
      } else if(stop == 5) {
        one_move3();
      }
    } else if(start == 2) {
      two_move2();
      if (stop == 3 || stop == 7) {
        run_case3();
        if(stop == 3) thd_move6();
        else thd_move3();
      } else if(stop == 4 || stop == 8) {
        run_case3(); run_case4();
        if(stop == 4) fth_move6();
        else fth_move3();
      } else if(stop == 1 || stop == 5) {
        run_case8();
        if(stop == 1) one_move6();
        else one_move3();
      } else if(stop == 6) {
        two_move3();
      }
    } else if(start == 3) {
      thd_move2();
      if(stop == 1 || stop == 5) {
        run_case7(); run_case8();
        if(stop == 1) one_move6();
        else one_move3();
      } else if (stop == 2 || stop == 6) {
        run_case7();
        if(stop == 2) two_move6();
        else two_move3();
      } else if(stop == 4 || stop == 8) {
        run_case4();
        if(stop == 4) fth_move6();
        else fth_move3();
      } else if(stop == 7) {
        thd_move3();
      }
    } else if(start == 4) {
      fth_move2();
      if(stop == 8) {
        fth_move3();
      } else if(stop == 3 || stop == 7) {
        run_case6();
        if(stop == 3) thd_move6();
        else thd_move3();
      } else if(stop == 2 || stop == 6) {
        run_case6(); run_case7();
        if(stop == 2) two_move6();
        else two_move3();
      } else if(stop == 1 || stop == 5) {
        run_case5();
        if(stop == 1) one_move6();
        else one_move3();
      }
    } else if(start == 5) {
      one_move5();
      if(stop == 1) {
        one_move6();
      } else if(stop == 2 || stop == 6) {
        run_case2();
        if(stop == 2) two_move6();
        else two_move3();
      } else if(stop == 3 || stop == 7) {
        run_case2(); run_case3();
        if(stop == 3) thd_move6();
        else thd_move3();
      } else if(stop == 4 || stop == 8) {
        run_case1();
        if(stop == 4) fth_move6();
        else fth_move3();
      }
    } else if(start == 6) {
      two_move5();
      if (stop == 3 || stop == 7) {
        run_case3();
        if(stop == 3) thd_move6();
        else thd_move3();
      } else if(stop == 4 || stop == 8) {
        run_case3(); run_case4();
        if(stop == 4) fth_move6();
        else fth_move3();
      } else if(stop == 1 || stop == 5) {
        run_case8();
        if(stop == 1) one_move6();
        else one_move3();
      } else if(stop == 2) {
        two_move6();
      }
    } else if(start == 7) {
      thd_move5();
      if(stop == 1 || stop == 5) {
        run_case7(); run_case8();
        if(stop == 1) one_move6();
        else one_move3();
      } else if (stop == 2 || stop == 6) {
        run_case7();
        if(stop == 2) two_move6();
        else two_move3();
      } else if(stop == 4 || stop == 8) {
        run_case4();
        if(stop == 4) fth_move6();
        else fth_move3();
      } else if(stop == 3) {
        thd_move6();
      }
    } else if(start == 8) {
      fth_move5();
      if(stop == 4) {
        fth_move6();
      } else if(stop == 3 || stop == 7) {
        run_case6();
        if(stop == 3) thd_move6();
        else thd_move3();
      } else if(stop == 2 || stop == 6) {
        run_case6(); run_case7();
        if(stop == 2) two_move6();
        else two_move3();
      } else if(stop == 1 || stop == 5) {
        run_case5();
        if(stop == 1) one_move6();
        else one_move3();
      }
    }

  } // end of unicasting

  /**
   *  inner class 1, 직접 소켓으로 이동한다.
   */
   class Network2 implements Runnable {
    ServerSocket ss = null;
    Thread th = null;
    Vector globalvc = new Vector(); // Client정보를 저장하기 위한 벡터 Object

    Network2() { //Network 클래스의 생성자
      try {
        ss = new ServerSocket(7728);
      } catch(Exception ex) {}
    }

    // 네트워크 서버 가동
    public void servStart() {
      th = new Thread(this);
      th.start();
      System.out.println("server Start");
    }

    public void run() {
      while(!th.isInterrupted()) {
        try {
          System.out.println("thread 가동중...");
          Socket s = ss.accept();
          System.out.println(s);
          Service sv = new Service(s);
          sv.start();
        } catch(IOException ex) {}
      }
    } // end of Run()

    /**
     * Network 에서 서버에세 메세지를 처리 하기 위한 서비스 클래스
     */
    class Service extends Thread {
      Socket s;
      String ip = "127.0.0.1";
      String mac = "abse2c2ro1ce";

      BufferedReader in;   // 값을 받아 오기 위해
      OutputStream out;   // 값을 보내 주기 위해

      Service(Socket s) {  // 생성자 생성
        try {
          System.out.println("Service 객체 생성");
          this.s = s;
          in = new BufferedReader(new InputStreamReader(s.getInputStream()));
          out = s.getOutputStream();
        } catch(Exception ex) {}
      } // end of Service

      public void run() {
        while(true) {
          System.out.println("Service의 Thread 가동중...");
          try {
            String msg = in.readLine();
            if(msg == null) return;

            System.out.println("client : " + msg);
            StringTokenizer st = new StringTokenizer(msg,"|");
            int prot = Integer.parseInt(st.nextToken());
            switch(prot) {
              case 100: { // 접속
                ip = st.nextToken();
                mac = st.nextToken();
                globalvc.addElement(this);
              }break;

              case 200: { // request
                String myMac = st.nextToken(); // 요청자의 mac주소
                String myIP = st.nextToken(); // 요청자의 ip주소
                String youMac = st.nextToken();
                String youIp = st.nextToken(); // mac을 원하는 ip주소

                for(int i=0;i<8;i++) {
                  if(myIP.equals(log_hard[i][0])) {
                    show_All(i+1);
                  }
                }
                try {
                  outMessageAll("200" + "|"  // 메세지 전달
                                + myMac + "|"
                                + myIP + "|"
                                + youMac + "|"
                                + youIp);
                } catch(Exception ex) {}
              } break;

              case 300: { // response
                String seMac = st.nextToken();
                String seIp = st.nextToken();
                String tarMac = st.nextToken();
                String tarIp = st.nextToken();

                for(int i=0;i                  Service sv = (Service)globalvc.elementAt(i);
                  if(sv.ip.equals(tarIp)) {
                    find_item(seIp,tarIp);
                    sv.outMessageTo("300|" +
                                    seMac + "|" +
                                    seIp + "|" +
                                    tarMac + "|" +
                                    tarIp);

                    //t//able_up(seIp,seMac,find_num(seIp));
                   break;
                  }
                }
              } break;

              case 400: {

              }break;
            }
          } catch(Exception ex) {
            break;
          }
        }

      } // end of run()
      public int find_num(String ip) {
        int tem = 0;
        for(int i=0;i<8;i++) {
          if(ip.equals(log_hard[i][0])) tem = i;
        }
        return tem;
      }
      private void find_item(String one, String two) {
        int on1 = 0, tw2 = 0;
        System.out.println("find_item");
        for(int i=0;i<8;i++) {
          if(one.equals(log_hard[i][0])) on1 = i+1;
          if(two.equals(log_hard[i][0])) tw2 = i+1;
        }
        if((on1 != tw2) && (on1 != 0) && (tw2 != 0))
          uniCasting(on1,tw2);
      }

      // 연결된 Client들에게 모두 메세지를 전송할때...
      protected synchronized void outMessageAll(String msg) {
        for(int i=0; i          Service sv = (Service)globalvc.elementAt(i);
          try {
            sv.outMessageTo(msg);
          } catch(Exception ex) {
            globalvc.removeElementAt(i--);
          }
        }
      } // end of putMessageAll

      // 연결된 Client중 특정 Client에만 메세지를 전송할때...
      protected synchronized void outMessageTo(String msg) throws Exception {
        System.out.println("\nServer Out(outMessageTo) : " + msg);
        try {
          out.write((msg + "\r\n").getBytes());
        } catch(Exception ex) {}
      } // end of putMessageTo
    }
  } // end of network2

//////////////////////////////////////////////////////////////////////////////////
  /** one_1 innerClass
   * One_1 innerClass 로 Runnable을 implements함
   * 여기서 하는일은 가상 c/s환경중 Client 환경을 제공함
   */
  class One_1  implements Runnable {
    Socket s = null; // C/S 통신용 소켓 선언
    BufferedReader in; // socket으로 입력을 받기위한 객체
    OutputStream out; // socket으로 출력하기 위한 객체
    String myIp = "245.123.123.123";
    String myMac = "ad42cb21ff1e";
    int myNum = 0; // 내 번호
    public One_1() { }
    /**
     * 자기 자신의 Num이 몇번인지 설정하기 위한 메소드
     * @param my num값을 받아온다.
     */
    public void set_Num(int my) {
      myNum = my;
    }
    /**
     * 새로 protocol Address를 추가할때 쓰이는 메소드
     * @param pt pt is Protocol Address
     */
    public void add_item(String pt) {
      System.out.println("call add_item");
      add_item("P",0, 0, 0, pt, "");
    }
    /**
     * add_item의 오버로딩된 메소드로 총 6개의 값을 받아와 Table에 새로 추가한다.
     * @param st state 정보값
     * @param que queue의 값
     * @param atem attemp의 값
     * @param ti time-out의 값
     * @param pt protocol address의 값
     * @param hd hardware address의 값
     */
    public void add_item(String st, int que, int atem, int ti, String pt, String hd) {
      System.out.println("call add_item2");
      ta[myNum].addRow(st,String.valueOf(que),String.valueOf(atem),String.valueOf(ti),pt,hd);
    }
    /**
     *  서버에 접속하기 위한 메소드
     * @param ip Protocol Address
     * @param mac Physical Address
     */
    public void connProcess(String ip, String mac) {
      try {
        s = new Socket("localhost", 7728);
        in = new BufferedReader(new InputStreamReader(s.getInputStream()));
        out = s.getOutputStream();
        myIp = ip;
        myMac = mac;
        out.write( ("100" + "|" + myIp + "|" + myMac + "\n").getBytes());
        new Thread(this).start();
      } catch (Exception ex) {}
    }

    /**
     * 내가 다른 터미널에 mac을 요청할경우
     * @param endIP Target IP
     */
    public void sendProcess(String endIP) {
      if(myIp.equals(endIP)) {

      } else {
        System.out.println("다른 터미널에게 mac addr. 요청...");
        try {
          out.write( ("200|" + myMac + "|" + myIp + "|not|" + endIP + "\n").
                     getBytes());
        }
        catch (IOException ex) {}

        add_item(endIP);
        System.out.println("mynum is : " + myNum);

      }
    }
    /**
     * run() One_1 class의 Thread 처리 메소드
     * ARP를 요청 할경우 상대방에게 내 MAC 정보를 넘겨 준다.
     * 내가 ARP를 요청 했을때 반환되서 돌아오는 MAC정보를 받아 Table을 update를 시킨다.
     */
    public void run() {
      while(true) {
        try {
          String msg = in.readLine();
          if(msg == null) return;
          System.out.println("client : " + msg);
          StringTokenizer st = new StringTokenizer(msg,"|");
          int prot = Integer.parseInt(st.nextToken());
          switch(prot) {
            case 200 : {
              String one_mac = st.nextToken(); // 요청한 유저의 mac
              String one_ip = st.nextToken(); // 요청한 유저의 주소
              String two_mac = st.nextToken(); // 메세지 보낸 위치 물리적 주소
              String two_ip = st.nextToken(); // 메세지 보낸 위치 주소
              if(two_ip.equals(myIp)) {
                try {
                  out.write(("300|" + myMac + "|" + myIp + "|" + one_mac
                             + "|" + one_ip + "\n").getBytes());
                } catch(IOException ex) {}
              }
            }break;
            case 300 : {
              String one_mac = st.nextToken(); // 요청한 유저의 mac
              String one_ip = st.nextToken(); // 요청한 유저의 주소
              String two_mac = st.nextToken(); // 메세지 보낸 위치 물리적 주소
              String two_ip = st.nextToken(); // 메세지 보낸 위치 주소
              ta[myNum].updateRow("R","1",one_ip,one_mac);
              System.out.println("this num is : " + myNum);
            } break;
          }

        } catch(Exception ex) {
          break;
        }
      }
    }

  } // end of Client 클래스


} // end of main class



반응형
Posted by onlyTheOne
,
반응형
스택 큐 짬뽕 플그램
스택 에 오버플로우 발생시 큐에 스택 내용저장하는 프로그램

소스
----------------------------------------------------------------------------------
#include <stdio.h>
#include <conio.h>

int stack[10];
int top;
int queue[10];
int front, rear;

void init_stack();
void push(int vall);
void pop();
void print_stack();
void init_queue();
int get();
int put(int put_num);
void print_queue();
void send_queue();

// 스택
void init_stack() {
  top = -1;
}

void push(int vall) {
  if(top >= 9) {
    printf("\n 스택이 찼습니다. 큐로 바꾸어 저장하겠습니다.\n");
    send_queue();
  } else {
    stack[++top] = vall;
    printf("스택에 저장한 숫자 : %d\n", vall);
  }
}

void pop() {
  if(top < 0) {
    printf(" 스택비움\n");
  } else {
    --top;
  }
}

void print_stack() {
  int i;
  printf(" 스택 top -------------------- buttom\n");

  for(i = top; i>=0;i--) {
    printf("%d ", stack[i]);
  }
  printf("\n");
}

void send_queue() {
  // 스택에서 뽑아서 큐에 저장

  int i;
  printf("스택 Data -> 큐 로 이동\n");
  for(i=top;i>=0;i--) {
    int flag = put(stack[i]);
    if(flag == 0) break;
  }
  printf("스택 Data 큐에 저장완료\n");
}

// 큐
void init_queue() {
  front = rear = 0;
}

int get() {
  int get_num;
  if(front > 9) {
    printf("언더플로우 발생\n");
    get_num = -1;
  } else {
    get_num = queue[front++];
  }
  return get_num;
}

int put(int put_num) {
  int flag = 1;

  if(rear > 9) {
    printf("오버플로우발생\n");
    flag = 0;
  } else {
    queue[rear++] = put_num;
  }
  return flag;
}

void print_queue() {
  int i;
  printf("큐 first ----------- last \n");
  for(i = front; i < rear; i++) {
    printf("%d ", queue[i]);
  }
  putch('\n');
}

void main() {

  int select_num;
  int push_num;
  int exit_flag = 0;

  printf("스택과 큐를 통합한 프로그램\n");

  init_stack(); // 스택초기화
  init_queue(); // 큐초기화
  while(1) {
    printf(" 1) push 2)pop 3)stack data print 4)stack&queue data print 5)Quit! \n");
    printf("숫자를 선택해 주세요 : " );
    scanf("%d",&select_num);

    if(select_num > 4) break;
    else {
      switch(select_num) {
        case 1 :
          printf("푸쉬 숫자를 입력해주세요 => ");
          scanf("%d", &push_num);
          push(push_num);
          printf("푸쉬 실행\n");
        break;
        case 2:
          pop();
          printf("팝 실행\n");
        break;
        case 3:
          print_stack();
        break;
        case 4:
          print_stack();
          print_queue();
        break;
      }
    }
  }
  printf("프로그램을 종료합니다.\n");
  getch();
}
반응형
Posted by onlyTheOne
,