반응형

원래 지금 여기에 작성된 네트워크 이야기는...

제가 타사 블로그에서 썼던 내용을....

개인적인 블로그의 이원화 정책에 따른...

자료 이동 입니다...

앞으로 진행은 이곳에서 이루어 질려고 합니다....

내가 겪은 네트워크 이야기 그 7번째.....

내가 겪은 분야는 솔직히 네트워크라는 세계에서 빙산의 일각에 불과한 영역이다...

장비 마다 Config를 만진것도 아니며... 단지 설정된 config만 보며 알았던 것이다........

난 소위 말하는 그냥 그런 곳에 있었다..

망관리실은... Network Management System 이라고 불리우는 네트워크 관리 시스템이

있다... 관리 시스템은 독립적인 서버에 있으며..

이 서버에서 네트워크에 연결된 장비들의 상태를 확인하여....

망 을 운영을 하게 된다.....

이 거 말고 Entire network Management System.이라 불리우는 것도 있다....

위에껀 지역망 개념... 아래꺼는 광역망 개념이다....
(참고로 ... 물론 저 말이 맞는 말인지 나도 잘 모른다....
          그렇기 때문에 이런 세계도 있구나 라는 것만 알아 주었으면 한다....)

저 시스템을 이용 망을 관리하다 보면 별별 일들이 다 일어 난다...

무슨일이 일어 나냐구???

갑자기 장비가 원인 모를 이유로 다운 되는 경우가 있다.....

그리고 잘쓰던 장비도 괜시리 알람을 발생시킨다.....

왜 그러냐고.... 직접 운영해 보면 알 것이다..............

하지만 저 알람이 왜 발생했는지는 핵심적인 이유는 없지만 어디서 발생했는지는 알수 있다...

오늘은 이중에서 ping을 통한 망 문제에 대해 이야기 할려고 한다...

통상적으로 흔히 쓰는.. Ping!!!

장비에 Ping 을 쏠경우... Ping은 돌아 와야 한다...

ping을 쳤을때 돌아오는 메세지 중에 보면...
   -> Reply from xxx.xxx.xxx.xxx : byte=32 time<10ms ttl=64

머 이런식으로 나온다....

저게 일반적인 ping 결과이다.. 즉....
    "ip가 부여된장비에 대해 너 장비 살아 있냐? "
물어 보면..
    "나 살아있다... 라고 알려주는 것이다..."

이런 메세지가 뜨면...
-> Request time out

응답시간 초과... 즉... 그 장비에서 응답이 없는 것이다.. 응답이 없는 이유는...
  1. 장비의 이상으로 인하여
  2. 아이피를 잘못 입력하였을 경우
  3. 운영정책에 의거 보안을 위해 ping을 반환안하도록 운영할경우
  4. 회선의 이상으로 인하여

우선 장비의 이상이라 함은 장비 전체의 문제이거나 해당 모듈 부분의 문제 아님 특정 문제로
인해서 발생할 수 있다. 어디가 문제라고 단정지을수는 없는 것이다.

아이피를 잘못입력하였을때 저 메세지가 안나오고 그위의 메세지가 나올수 있다..
그 이유는 잘못입력한 IP가 특정장비에 할당되어 있다면 거기서 받아오기 때문이다.
하지만 그 장비가 내가 원하는 장비인지는 제대로 된 IP를 알때만 가능한 것이다.

운영정책의 보안상... 요즘 별별 인간들이 다 있다... 돈을 벌기 위해, 자기 실력 과시용
등등.. 그런사람들로 부터 서비스를 안정적으로 제공하기 위해 정책적으로 ping값을
반환 안시키도록 설정하는 것이다.

회선이 죽었을때도 저 메세지가 나오는건 ??
회선이 중간에 단락되도 저렇게 나온다..(내 경험상...)

그럼 어떻게 회선이 끈어 지는지 아냐고.... KT(외 회선 서비스 제공업체)는
평상시에 원활한 서비스를 위해 거의 매일 저녁 마다

노후화 된 회선을 교체 하거나.. 회선을 이중화 작업을 한다든가... 회선이 물려진 장비를 관리를 한다....

이때.. 머피가 나에게 찾아 오면 인터넷이 안되는 경우이다... 물론 이런경우는 극히 드물다...

요즘은 거의 이중화가 되어 있기에 사용자도 모를 정도로 회선이 전환된다...

물론 누가 전봇대에 테러하면 그만이지만...

to be continue....

반응형
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
,
반응형

eXtream에서 보여주지 않는것 즉... cache table에 대한 정보를 보여주기 위해만든 것으로

가상 HOST의 정보를 표기한다.

myTable.java

Queue가 구현되어 있으나 사용하지는 않는다.

//---------------------------------------------------------------------------------

/*
 * Author: TheOne
 * Created: 2004년 5월 8일 토요일 오후 8:41:20
 * Modified: 2004년 5월 8일 토요일 오후 8:41:20
 */

import! java.awt.*;
import! javax.swing.*;
import! javax.swing.table.*;
import! java.util.Vector;
import! java.util.LinkedList;

public class myTable extends JFrame {

  JScrollPane pane1 = new JScrollPane();
  String data[][] = new String[0][6];
  String col[] = {"State","Queue","Attemp","Time-out","Protocol Addr.","Hardware Addr."};
  DefaultTableModel model = new DefaultTableModel(data,col){
    public boolean isCellEditable(int row, int col) {
      return false;
    }
  };

  LinkedList que = new LinkedList();

  JTable table = new JTable(model);
  JLabel jLabel1 = new JLabel();
  JLabel jLabel2 = new JLabel();
  JLabel jLabel3 = new JLabel();
  JLabel jLabel4 = new JLabel();
  JTextField tf_ip = new JTextField();
  JTextField tf_mac = new JTextField();
  JButton bu_update = new JButton();

  myTable() {
    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }

  private void jbInit() throws Exception {
    this.getContentPane().setBackground(Color.white);
    this.setResizable(false);
    this.setState(Frame.NORMAL);
    this.setTitle("Cache Table");
    this.getContentPane().setLayout(null);
    table.getColumnModel().getColumn(0).setPreferredWidth(38);
    table.getColumnModel().getColumn(1).setPreferredWidth(42);
    table.getColumnModel().getColumn(2).setPreferredWidth(50);
    table.getColumnModel().getColumn(3).setPreferredWidth(70);
    table.getColumnModel().getColumn(4).setPreferredWidth(100);
    table.getColumnModel().getColumn(5).setPreferredWidth(100);
    table.setSelectionMode(0);
    table.getTableHeader().setReorderingAllowed(false);
    table.getTableHeader().setBackground(new Color(235,211,200));
    pane1.setBounds(new Rectangle(16, 140, 375, 226));
    jLabel1.setBackground(new Color(212, 218, 217));
    jLabel1.setFont(new java.awt.Font("SansSerif", 0, 12));
    jLabel1.setOpaque(true);
    jLabel1.setText("Computer 정보 : ");
    jLabel1.setBounds(new Rectangle(7, 9, 92, 23));
    jLabel2.setFont(new java.awt.Font("SansSerif", 0, 12));
    jLabel2.setOpaque(false);
    jLabel2.setText("● IP Address : ");
    jLabel2.setBounds(new Rectangle(17, 40, 88, 22));
    jLabel3.setBounds(new Rectangle(17, 67, 99, 22));
    jLabel3.setText("● MAC Address : ");
    jLabel3.setFont(new java.awt.Font("SansSerif", 0, 12));
    jLabel4.setFont(new java.awt.Font("SansSerif", 0, 12));
    jLabel4.setText("● Cache Table 정보  ");
    jLabel4.setBounds(new Rectangle(15, 115, 122, 22));
    tf_ip.setFont(new java.awt.Font("SansSerif", 0, 12));
    tf_ip.setEditable(false);
    tf_ip.setText("");
    tf_ip.setBounds(new Rectangle(120, 40, 163, 22));
    tf_mac.setFont(new java.awt.Font("SansSerif", 0, 12));
    tf_mac.setEditable(false);
    tf_mac.setText("");
    tf_mac.setBounds(new Rectangle(120, 67, 163, 22));
    bu_update.setBackground(new Color(212, 208, 255));
    bu_update.setBounds(new Rectangle(290, 115, 100, 23));
    bu_update.setText("Update");
    this.getContentPane().add(pane1, null);
    this.getContentPane().add(jLabel2, null);
    this.getContentPane().add(jLabel3, null);
    this.getContentPane().add(jLabel1, null);
    this.getContentPane().add(jLabel4, null);
    this.getContentPane().add(tf_ip, null);
    this.getContentPane().add(tf_mac, null);
    this.getContentPane().add(bu_update, null);
    pane1.getViewport().add(table, null);
    this.setSize(new Dimension(421, 410));
    //this.setVisible(true);
  }

  // 자기 자신의 ip를 설정한다.
  public void set_IP(String ip) {
    tf_ip.setText(ip);
  }
  // 자기 자신의 mac을 설정한다.
  public void set_Mac(String mac) {
    tf_mac.setText(mac);
  }
  // 자기 자신의 ip를 반환한다.
  public String get_IP() {
    return tf_ip.getText();
  }
  // 자기 자신의 mac을 반환한다.
  public String get_mac() {
    return tf_mac.getText();
  }
 // table의 정보를 업데이트 하는 메소드(parameter을 4개 받을때)
  public void updateRow(String st, String at, String pi, String hi) {
    try {
    for(int k=0;k<table.getRowCount();k++) {
      if(pi.equals(model.getValueAt(k,4))) {
        model.setValueAt(st,k,0);
        model.setValueAt(at,k,2);
        model.setValueAt(hi,k,5);
      }
    }
  }catch(Exception ex) {
    System.out.println("ex : " + ex);
    }
  }
 // table의 정보를 업데이트 하는 메소드(parameter값을 2개 받을때)
  public void updateRow(String ip, String mac) {
    for(int i=0;i<table.getRowCount();i++) {
      if(ip.equals(model.getValueAt(i,4).toString())) {
        model.setValueAt(ip, i, 4);
        model.setValueAt(mac,i,5);
      }
    }
  }
  // table에 새로운 값을 저장하는 메소드
  public void addRow(String st, String qu, String at, String ti, String pi, String hi) {
    removeRow(pi); // 중복된 값을 제거 하기 위해서
    String temp[] = {st, qu, at, ti, pi, hi};
   model.addRow(temp);
  }
  // Table에 저장된 값을 삭제하는 메소드
  public void removeRow(String ip) {
    for(int i=0;i<model.getRowCount();i++) {
      if(ip.equals(model.getValueAt(i,4))) {
        model.removeRow(i);
      }
    }
  }
  // Pending인지 Resolved인지 값을 넘겨줌
  public String get_State(String ip) {
    String item = null;
    for(int i=0;i<model.getRowCount();i++) {
      if(ip.equals(model.getValueAt(i,4))) {
        item = model.getValueAt(i,0).toString();
      }
    }

    return item;
  }

  // ip값이 있는지 없는지 체크하는것
  public boolean isIpRow(String ip) {
    boolean tf = true;
    for(int i=0;i<model.getRowCount();i++) {
      if(ip.equals(model.getValueAt(i,4))) {
        tf = false;
      }
    }
    return tf;
  }
  // 큐에 item을 저장하는 메소드
  public void push_que(String item) {
    que.addFirst(new String(item));
  }

  // 큐에서 item을 빼는 메소드
  public String pop_que() {
    String temp = (String)que.getLast();
    return temp;
  }
}

반응형
Posted by onlyTheOne
,
반응형

myObject.java 파일에서 하는 일은...

IP를 요청받기 위한 GUI 화면을 보여주고

사용자로 부터 받아온 IP정보를 받아와서 eXtream.java 소스에 이동시켜주는 일을 한다.
//--------------------------------------------------------------------------------------

import java.awt.*;
import javax.swing.*;

public class myObject extends JFrame {
  JLabel jLabel1 = new JLabel();
  JLabel jLabel2 = new JLabel();
  JTextField tf_ip = new JTextField();
  JButton bu_ok = new JButton();
  JButton bu_cancel = new JButton();
  private int system = 0;

  myObject() {
    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }

  }
  private void jbInit() throws Exception {
    jLabel1.setFont(new java.awt.Font("SansSerif", 0, 12));
    jLabel1.setText("IP address :");
    jLabel1.setBounds(new Rectangle(13, 43, 78, 25));
    this.getContentPane().setBackground(new Color(215, 222, 217));
    this.setResizable(false);
    this.setTitle("ARP 요청처리");
    this.getContentPane().setLayout(null);
    jLabel2.setFont(new java.awt.Font("SansSerif", 0, 12));
    jLabel2.setText("원하시는 컴퓨터의 IP를 입력하세요");
    jLabel2.setBounds(new Rectangle(13, 10, 205, 30));
    tf_ip.setText("");
    tf_ip.setBounds(new Rectangle(96, 43, 124, 25));
    bu_ok.setBounds(new Rectangle(96, 74, 62, 24));
    bu_ok.setFont(new java.awt.Font("SansSerif", 0, 12));
    bu_ok.setMaximumSize(new Dimension(57, 25));
    bu_ok.setMargin(new Insets(0, 0, 0, 0));
    bu_ok.setText("요청하기");
    bu_cancel.setBounds(new Rectangle(158, 74, 62, 24));
    bu_cancel.setFont(new java.awt.Font("SansSerif", 0, 12));
    bu_cancel.setMargin(new Insets(0, 0, 0, 0));
    bu_cancel.setText("취소하기");
    this.getContentPane().add(jLabel1, null);
    this.getContentPane().add(jLabel2, null);
    this.getContentPane().add(tf_ip, null);
    this.getContentPane().add(bu_ok, null);
    this.getContentPane().add(bu_cancel, null);
    this.setSize(240,140);
  }

  public void set_ProcessNum(int i) {
    system = i;
  }
  public int get_ProcessNum() {
    return system;
  }
}

반응형
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
,
반응형

제가 써가는 네트워크 이야기..가  벌써 6번째 이네요..

오늘은... 몇일전 오랜만에 뵌 지인 분의 조언을 받아......

진행 방향을 조금 바꿔 볼까 합니다...

우선...... 여기서 적는 네트워크에 대한 소견은....

저의 사견이며....... 절대적 원론적이지 않으며 시시때때 바뀔수 있다는 점 입니다.

지인 분이 저에게 이렇게 질문 하시더군요..

CCNA를 가지고 있는 신입사원에게 네트워크에 대해 잘 알고 있다고 판단되여

네트워크 구축 및 운영 업무를 맞기면서

CSU 와 라우터를 연결해 보라고 하면 답이 어떻게 나올까요?

대 부분의 분들은 " No! " 라고 외치실 겁니다.

네 바로 그겁니다.

제가 아는 네트워크에 대한 지식은 빙산의 일각이며 여러분이 알고 있는 네트워크에 대한 지식도

빙산의 일각에 불과하니 자기의 지식에 대해 너무 자랑스럽게 생각하지 않으셨으면 합니다.

CCNA가 네트워크 세계에 통용되는 자격증의 한 부분일뿐이지 네트워크에 있는 모든 장비를 다 내 맘대로 할수 있어 라는

뜻이 아니라는 겁니다.

그냥 쬐금 알고 있다고 보시면 됩니다. ^^:~~

그럼.... 계속 진행을 하도록 하겠습니다. 오늘은 제가 운영한 망에서의 trouble shooting 경험에 대해 관련해 적어 볼려고 합니다.

엇나갈수도 있다는거 잊지 마시구요 ^^:

트러블 슈팅.... 우리말로 하자면 문제 해결 이라고 볼수 있는데요 망을 운영 관리 하다보면...

전혀 엉뚱 한곳에서 문제가 발생하여 네트워크의 장애를 초래 하거나 네트워크의 전송 속도를 Down 시키는 등

많은 문제를 이야기 시킵니다...

우선 기본 적인 네트워크 장비 들 부터 볼까요?

대다수의 분들이 이렇게 말씀하시겠죠... "라우터요~~~"

음 맞긴 맞는데 극히 일부분 입니다. 그럼 저는 이렇게 질문 하고 싶습니다.

"그럼 라우터는 무슨 역할을 하나요?"

생각할 시간을 드리겠습니다.

답은? 맞추시는분들도 있고 대답 못하시는 분들도 계실 겁니다....

Router... Route란... 네이버 사전을 찾아 보면

route
1a 길(road), 노정;루트;항로(航路)
2 《미》 (우유·신문 등의) 배달 구역
3 《고어》 【군사】 행군 명령
1 <…의> 루트를 정하다

이렇게 나옵니다.

즉 루트를 정하다...... 즉 DATA를 전송하기 위한 경로를 잡아주는 장비가 바로 Router 인 겁니다...

이렇게 말씀 드리면 이해 되시죠?

이해 되셨을거라 믿고...

그럼 왜 라우터가 필요할까요???

왜 경로설정이 필요 할까요??

먼저 네트워크의 전송 방식에 대해 알아 보고 넘어 가겠습니다.

네트워크의 전송 방식은...

Unicast, BroadCast, MultiCast 기본적으로 이 3개 방식이 있습니다.

3개 방식의 각각 특징을 적으며

UniCast -> 1:1 전송 입니다. 즉 다이렉트 케이블을 이용한 PC대 PC 연결이라고 생각하시
              면 빠릅니다. 아님 전화라고 보시면 되겠네요
                즉 송수신자가 DATA를 오직 송,수신자로 부터 송,수신하여 Communication
              하는 방식 입니다.

BroadCast -> 1:다수 전송 입니다. 이건... 말그대로 방송과 같습니다. 송신자는 1명이며
              송신시에 전 네트워크에 DATA를 전송해 주는 전송 입니다. 수신자가 수신을
              하던 안하던 상관 안하고 보내는 겁니다.

MultiCast -> 1:N 전송입니다. 여기서 N이란... 특정 유저의 DATA를 N이라는 그룹에 속해
              있는 유저들만 DATA를 수신 받겠다는 뜻입니다. 즉 송신하는 컴퓨터에서 DATA는
              수신하겠다는 OK싸인이 떨어진 컴퓨터로만 DATA를 전송 하는 겁니다.

이제 위의 전송 방식에서 나타날수 있는 문제점들에 대해 이야기 해 보고자 합니다

기본적으로 우리가 쓰는 이더넷 방식이란 CSMA/CD 방식을 취하고 있습니다.

CSMA/CD란... (네이버 사전 참조)
더넷은 데이터 전송을 위해 다음과 같은 내용의 CSMA/CD(carrier sense multiple access with collision detection) 방식을 사용한다. 데이터를 보내려는 컴퓨터가 먼저 통신망이 사용 중인지 아닌지 검사한 후에 비어 있을 때 데이터를 보낸다. 통신망이 사용 중이면 일정시간을 기다린 후 다시 검사한다. 통신망이 사용 중인지는 전기적인 신호로 확인할 수 있다.

만약 두 대의 컴퓨터가 동시에 검사하여 통신망이 사용 중이지 않다는 것을 확인하고 동시에 전송하게 되면 충돌이 발생한다. 이런 경우에 대비해서 데이터를 전송한 컴퓨터는 자신의 데이터가 손상되지 않았는지를 확인하여 손상이 있으면 다시 전송하게 된다. 이때 두 컴퓨터의 재전송이 동일한 시간 후에 일어나면 다시 충돌이 발생하므로 재전송 시간은 일정한 방법에 의해 변경된다.

이기때문에... BroadCast 방식의 전송은 네트워크 전체에 악영향을 초래 할수 있는 겁니다.

다시 원래 대로 돌아가......... CSU와 라우터 연결할줄 아시는분???????

없으시죠? 왠 만한 분들은 책만 봐서는 모를 겁니다.

직접 안해본 이상....

회선 구성은  기본적으로  Router - CSU - 전송장비(회선 서비스제공업체) - CSU - Router 이렇게 이루어 집니다.

머 요즘은 광을 쓰는 시대라 ~~~

오늘은 여기까지 적도록 하겠습니다.

더 나가단 스파게티성 강의가 더 꼬일거 같아서요 ^^:~

저도 정리좀 하고 써야 해서~~ 이해 부탁드립니다.

그럼 다음 이시간에 ...

반응형
Posted by onlyTheOne
,
반응형
안녕하세요 요즘 방문자가 급 폭주 할때가 많이 있네요...

글도 몇개 없는데...

요즘 블로그 관리자는...

학업에 정진 중입니다.

학과 과목중에 텀프로젝트로 나오는 과목이 많아.

그것들을 다 준비하느라 정신 없네요..

인공지능에서 정보보호까지..

에휴 ㅠ.ㅠ

힘드네요..

그럼!~~

곧 이것저것 올리겠습니다.
반응형
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
,
반응형

네트워크 이야기 그 다섯번째.. 입니다...

이번에는 ATM 에 대해서 이야기 해볼까 합니다.

1. ATM이란...
  -> ATM은... 역시 약자 입니다. 무슨 단어의 약자 이냐면...
      Asynchronous Transfer Mode의 줄임말입니다.
     
     우리말로 하자면... 비동기 전송 방식입니다. 왜 비동기 전송이냐... 음 글쎄요 ㅋㅋ
     ATM cell을 이용해서 DATA를 전송하기 때매 그랬나 봅니다. 그럼 반대는 STM이겠죠?   
     ^^:~~
     전송을 하기 위해선 VPI와 VCI를 지정하여 전송을 합니다.

2. ATM cell은?
   -> ATM 에서 전송방식은 52bytes 사이즈로 이루어진 ATM Cell이 기본 입니다.
       이 cell은... 5바이트의 헤더와 48바이트의 payload. 일종의 DATA 저장 공간을
       가지고 있습니다. ATM은 어떠한 데이터가 들어 오든 ATM Cell에 집어 넣어
       전송합니다.

3. 왜 ATM이냐...
   -> ATM은 여러 DATA들을 수용할수 있습니다. 하다 못해 전화 회선도 수용가능해서..
       ATM이라는 단일 장비를 통해서 단일 통신 프로토콜로 여러 데이터를 혼합 하여
       한방에 전송하겠다는 의지를 가지고 시작한 걸 겁니다.... 물론 ATM이..
     
       좋은 아이디어 였습니다.... 하지만... 비싼 장비 가격으로 인해 그리고 이더넷의
      등장으로 차츰 사용 %가 감소하여서 지금은 거의 안쓰고 있습니다. 하지만! 아에
      안쓰는 건 아닙니다. K모 사에서도 아직도 이 ATM장비를 이용한 ATM망이 존재 합니다.

       A~B지점을 연결하는 전용회선으로 쓰기에는 저렴하게 제공되기 때문이죠..
      그리고 기존 장비를 걷어 내기도 머하니깐요..

4. ATM장비는..
  -> ATM 장비는 음.... 저는 이렇게 배웠습니다. ATM 교환기라 불리우는 장비가 있습니다.
      광역망을 지원하기 위해 ATM 백본 교환기와 구내망 지원을 위한 ATM 접속 교환기가
      있습니다. 먼저 ATM 접속 교환기가 나오고 그리고 백본 교환기가 나왔습니다.
       백본은 말 그대로 중추 신경계라는 뜻이구요 접속은... 중추 신경계에 들어서기전 한번
      모이는 것을 뜻합니다 아래 그림을 보면(타사 블로그 그림그리기 툴 이용) 붉은계열
      장비가 백본 교환기 푸른계열 장비가 접속교환기라고 보시면 됩니다.
       현재 사용중인 장비들은 알모사의 제품들이 남아 있는 걸로 알고 있습니다. 장비
      구성은... 머... 라우터와 같다고 보시면 빠릅니다.

      껍데기 + DATA 처리 카드 + 회선 연결 카드 -> 교환기... 이렇죠...

      백본교환기에서 제공되는 속도는 T1~155Mb까지 커버 됩니다. 물론 실장량은 최대
      622MB까지 인걸로 알고 있습니다. 여기서 실장량이라 함은 제가 쓰는 말이구요...
      장비에서 지원되는 회선 속도의 합... 즉 622이 최고인걸로 알고 있습니다.
      맞는지 틀린지는 ^^:~~(야매 강좌~~ ㅋㅋ) 여기에 연결되는 케이블은 UTP, 동축,
      광케이블이 있겠습니다. 광~~은  컨넥터 type이... SC 타입인가 그럴겁니다..
       접속교환기는 광케이블이 빠집니다. 그리고 구형이라 처리용량도 많이 느리구요....
       거의 RJ-45 커넥터나 BNC, 하나 더 있는데 케이블을 등이 있습니다.

       그리고 다음 장비는... ATM 컨트롤 서버입니다. 즉... NMS라는 개념과 함께 세팅을
      실시간으로 하기 위해 있는 장비 입니다. 일반 서버 보다는 그냥 워크스테이션급
      컴퓨터에서 돌리며 장비상태 들을 확인하고 장비 세팅같은걸 할 수 있습니다.
      ATM은 정말~~ 절레절레... 구형 장비라 반응속도도 조금 느립니다. ㅋㅋ
 
     음 더 적을려고 했는데 졸려서 더 이상 못 적겠네요~~~
     조만간 Six 번째 시간에 적어야 겠네요~~

다음 시간에는 중간 정리 한번 하도록 하겠습니다.

야매 강좌를 봐주셔서 감사드립니다.

반응형
Posted by onlyTheOne
,
반응형
자바라는 이야기....

제가 자바라는 언어를 처음 접하며.. 지금까지..

프로그래밍을 해보며... 느껴왔던걸 적어 나가려 합니다...

자바 하면 떠 오르는건.....

일단 커피를 즐겨 마시는 분들은...

커피의 한종류로 알고계시고....

두번째는..... 자바 아이콘..... (아래 참조)
사용자 삽입 이미지

(출처 : JDK 설치 폴더 demo 실행프로그램 이미지 중 하나)



세번째는...... 자바 하면..... 자바스크립트가 생각 나실겁니다...

미리 밝혀 두지만...

자바와 자바 스크립트는 전혀 다른 부분입니다...

자바 스크립트가 자바 언어의 문법을 일부 쓰긴 하지만....

다르다는거........

일단 자바라는 언어의 최고의 장점은..

Write once, Run anywhere!

앞뒤가 바뀔때도 ㅋㅋ

한번 만들면 어디에서나 실행이 된다는거....

이걸 자바의 가장 좋은점이죠... 하지만 우리는... 한가지 모르고 넘어가서..

결국 두 번 일하게 되는 경우를 전 요즘 알게 되었답니다...

무엇이 문제인가?

자바로 프로그램을 제작하는 경우는 윈도우에서 할때도 있고... 맥에서 할때도..
유닉스, 리눅스에서 할때도 있습니다...

바로 이게 문제 입니다.!!!! 윈도우에서 AWT나 Swing을 이용하여 제작한 프로그램이..

맥에서나 유닉스에서 제대로 실행될까요???  실행시켜 보신분!!??

제가 말하는 답은.. 아니오 입니다... 제가 본 바로는 제대로 안됩니다...

그 이유는.... 바로 각 OS 별.... Character Encoding 방식이 다르기 때문입니다.

케릭터 어쩌구??가 머가 문제 인데요?? 라고 말하면...

일단...

대부분의 자바 공부하시는 분들이 많이 쓰는 study 환경에 대해 알아 보겠습니다.

대부분

Operating System은 MicroSoft사의 Windows XP(home, Professional)에

개발키트 : JDK 1.5(1.6버전),       통합개발환경 IDE는 eclipse를 쓰실겁니다...

아래는 윈도우에 설치된 이클립스 화면입니다.

사용자 삽입 이미지

(설명 : 우리가 일반적으로 프로그래밍시 보여지는 화면입니다., eclipse내 component의 위치는 사용자 마다 다를수도 있습니다. 보여지는 소스 코드는 자바 NIO관련 서적의 예제입니다. 제가 요즘 새로 산책을 공부하고 있거든요...)

자 이제 eclipse의 encoding의 설정을 확인해 보겠습니다. File 메뉴에..
Propertice 메뉴 아이템을 클릭하면..

사용자 삽입 이미지

위와 같은 옵션창이 나올겁니다... 이미지를 보시면 Text file encoding이라고 해서..
아래 보시면... Default 어쩌구 해서 MS949로 설정되어 있을겁니다. 만약 저파일을...
리눅스에서 수정할려고 띄우면 어떨까요???

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