Network

텔넷을 구현해보자. - 1차

_침묵_ 2007. 3. 31. 23:52

텔넷을 이클립스로 구현을 해보자. 텔넷을 어떻게 다 구현하나 고민하시는 분을 위해서 오픈소스를 사용하여 단순히 이클립스에서는 데이타의 전송만을 구현해보는 것을 목표로 한다.

 

텔넷 모듈을 제공해는 사이트에서 다운을 받아야 한다.

http://jakarta.apache.org/commons/net/

여기서 commons-net-1.4를 다운을 받는다.

 

구현해야하는 화면은 다음과 같다.

 

사용자 삽입 이미지

 

 


상단에 접속하고자하는 서버와 포트 그리고 연결 및 연결을 끊는 버튼이 위치하게 된다.

하단에 흰화면은 서버로부터 전송되는 데이타를 보여주게 된다.

 

Step 1 : 화면 구성

우선 만만한 화면을 만들어 보자. 이클립스의 뷰를 확장시켜 만들어 보다. 뷰의 화면이 만들어지는 곳은 createPartControl 이다.

public void createPartControl(Composite parent) {

    parent.setLayout(new FillLayout());

 

    Composite container = new Composite(parent, SWT.NONE);

    GridLayout layout = new GridLayout();

    layout.numColumns = 1;

    container.setLayout(layout);

 

    createIPPanel(container);

    createSwingPanel(container);

}

 

private void createIPPanel(Composite parent) {

    …

}

 

private void createSwingPanel(Composite parent) {

    …

}

 

 

화면의 구성은 자세하게 설명하지 않도록 한다. 어차피 버튼과 텍스트 필드의 배치만 하면 되기 때문에 어렵지 않으리라 생각이 된다. 소스를 보면 텔넷의 데이타를 보여주는 부분을 SWT의 Text 컨트롤이 아닌, Swing을 사용을 하는데, 이유는 다음과 같다.

텔넷의 경우 데이타의 전송은 Thread에서 이루어진다. 이클립스의 컨트롤은 하나의 제약이 있는데, Thread에서 입력은 불가능하다. 왜 이런 제약이 있는지는 마소 10월호인가에 자세히 나와있있다.

간단히 요약하면, UI Thread 즉 디스플레이 개체를 생성한 Thread에 한해서 Control의 액세스가 가능하다. 따라서 일반 Thread에서 처리하는 방법은 뒷부분에서 따로 설명을 하고 이런 제약이 없는 Swing을 사용하도록 한다.

 

Step 2 : Telnet Connection 생성

private void connectTelent() {

    client = new TelnetClient();

    TerminalTypeOptionHandler ttopt = new

    TerminalTypeOptionHandler("VT100", false, false, true, false);

    EchoOptionHandler echoopt =

           new EchoOptionHandler(true, false, true,false);

    SuppressGAOptionHandler gaopt =

           new SuppressGAOptionHandler(true, true,true, true);

    try {

        client.addOptionHandler(ttopt);

        client.addOptionHandler(echoopt);

        client.addOptionHandler(gaopt);

    } catch (InvalidTelnetOptionException e) {

         System.err.println("Error registering option handlers: "

                    + e.getMessage());

    }

 

    boolean end_loop = false;

    try {

        client.connect(txtIP.getText(), Integer.parseInt(port);

        Thread reader = new Thread(this);

            reader.start();

         } catch (Exception e) {

            

            return;

        }

    }

 

 

소스가 많이 복잡해보인다. 텔넷 접속 모드 마다 접속 관련 방법이 틀려서 복잡하다.

TerminalTypeOptionHandler("VT100", false, false, true, false); 에서 터미널 타입은 VT100으로 하였다.

 

client.connectTelnetClient 로 접속을 하도록 하였다.

Thread는 InputStream을 받도록 reader를 생성하였다.

public void run() {

    InputStream instr = client.getInputStream();

    try {

        byte[] buff = new byte[1024];

        int ret_read = 0;

 

        do {

            ret_read = instr.read(buff);

 

            logText.append(new String(buff, 0, ret_read));

 

            int value = verticalBar.getMaximum();

            verticalBar.setValue(value);

 

         } while (ret_read >= 0);

 

    } catch (Exception ignore) {

    }

 

    try {

        client.disconnect();

    } catch (Exception ignore) { }

}

 

이부분은 소켓 통신할때 흔히 보는 소스이다. InputStream으로 부터 read를 하다가 0보다 작은 수 즉 -1이 오면 서버에서 더이상 보낼 문자가 없으므로 read를 멈추도록 한다.

logText는 JTextArea인데, 서버로부터 온 문자를 출력하도록 append를 하였다.

그리고 현재 텍스트필드의 크기를 구해서 스크롤바를 하단으로 내리도록 했다. 하단으로 내리지 않으면 계속 같은 화면을 보고 있게 된다.

 

접속한 결과를 보도록 하자.

 

사용자 삽입 이미지

 


텔넷 서버에 접속을 하면 연결이 되었다는 메세지가 뜨게 된다.

지금은 reader만 생성을 했는데, 반대로 writer를 생성해서 서버로 메세지 전송도 가능하다.


'Network' 카테고리의 다른 글

netstat state  (0) 2007.05.18
서비스 포트  (0) 2006.12.04
Windows, Linux And Samba  (0) 2005.08.23