SSISO Community

시소당

애플릿 소켓 통신

애플릿도  소켓  통신이  가능하다.  다른  말로  웹브라우저에서  채팅과  같은  통신을  할  수  있다는  것이다.  하지만  애플릿의  보안  때문에  제약  사항이  따른다.  

앞에서  만든  채팅  클라이언트  프로그램(Client5.java)을  애플릿  버전으로  수정해  볼  것이다.  init,  start,  stop,  destroy의  역할에  따라  코드의  위치를  조금  수정해야한다.  먼저  init에는  애플릿을  초기화하는  코드,  즉,  필요한  컴포넌트를  생성·배치하고  이벤트를  처리하는  코드를  삽입할  수  있다.  start에는  서버와  연결하고  스레드를  실행시키는  코드를  삽입한다.  그리고  사용자가  다른  웹  페이지로  이동할  경우에는  서버와의  접속을  중지해야하기  때문에  stop  메소드에는  스트림과  소켓을  닫고  스레드를  멈추게  하는  코드를  삽입해야  할  것이다.  

서버  프로그램의  소스는  수정할  필요가  없다.  원래의  "Server5.class"를  실행시키면  된다.  

AppChatClient.java

  

import  java.awt.*;

import  java.applet.*;

import  java.net.*;

import  java.io.*;

import  java.awt.event.*;

public  class  AppChatClient  extends  Applet  implements  Runnable{

    private  TextField  nameBox=new  TextField("<이름>");

    private  TextArea  msgView=new  TextArea();

    private  TextField  sendBox=new  TextField();

    private  BufferedReader  reader;

    private  PrintWriter  writer;

    private  Socket  socket;

    private  Thread  chatThread;

    private  boolean  loop=true;                      //  스레드를  멈추게  하는  변수

    public  void  init(){                                        //  애플릿  초기화

        msgView.setEditable(false);

        setLayout(new  BorderLayout());

        add(nameBox,"North");

        add(msgView,"Center");

        add(sendBox,"South");

        sendBox.addActionListener(new  ActionListener(){

            public  void  actionPerformed(ActionEvent  ae){

                try{

                    writer.println(nameBox.getText()+"  :  "+  sendBox.getText());

                    sendBox.setText("");

                }catch(Exception  ie){}

            }

        });

    }

    public  void  run(){

        while(loop){                            //  loop가  false로  되면  스레드가  멈춘다.

            try{

                  msgView.append(reader.readLine()+"\n");

            }catch(IOException  ie){}    

        }

    }

    public  void  start(){              //  애플릿  시작

        try{

            msgView.append("서버소켓과의  연결을  시도합니다.\n");

            socket=new  Socket("127.0.0.1",  7777);

            msgView.append("채팅  준비가  완료되었습니다.\n");

            reader=new  BufferedReader(

                                                        new  InputStreamReader(socket.getInputStream()));

            writer=new  PrintWriter(socket.getOutputStream(),  true);

            chatThread=new  Thread(this);

            chatThread.start();

        }catch(Exception  e){

            msgView.append("연결  실패..");

        }

    }

    private  void  stopThread(){              //  스레드를  멈추게  한다.

        loop=false;

    }

    public  void  stop(){                              //  애플릿  실행을  멈추게  한다.

      stopThread();

      try{

          if(reader!=null)  reader.close();

          if(writer!=null)  writer.close();

          if(socket!=null)  socket.close();

          reader=null;  writer=null;  socket=null;

      }catch(IOException  ie){}

    }

}

  

위  애플릿  채팅  예제는  애플릿의  보안을  피하는  방법을  보여주는  아주  좋은  예이다.  애플릿은  애플릿을  제공하는  서버이외의  다른  시스템과는  통신할  수  없지만  서버가  중계자  역할을  해서  간접적으로  다른  시스템과도  통신할  수  있다.

  

[그림  21-15]  애플릿  보안  우회  


연습  문제

  

1.  클라이언트가  10개의  정수를  서버로  보내면  서버는  정수의  평균값을  계산하여  클라이언트로  보내는  서버/클라이언트  프로그램을  제작해보자.

2.  클라이언트에서  10개의  정수를  서버로  보내면  서버는  정수를  오름차순으로  정렬하여  클라이언트로  보내는  서버/클라이언트  프로그램을  제작해보자.  

3.  클라이언트가  문자열을  서버로  보내면  서버는  문자열을  단어  단위로  잘라서  클라이언트로  보내는  서버/클라이언트  프로그램을  제작해보자.  

4.  클라이언트끼리  가위바위보  게임을  할  수  있는  서버/클라이언트  프로그램을  만들어보자.  서버는  두  개  클라이언트만  지원하도록  하면  어렵지  않다.
  

5.  공개  방,  비밀  방,  귓말  보내기  기능이  있는  채팅  서버/클라이언트  프로그램을  설계해보자.  클라이언트와  서버의  통신을  그림으로  나타내보자.

1677 view

4.0 stars