시소당
애플릿도 소켓 통신이 가능하다. 다른 말로 웹브라우저에서 채팅과 같은 통신을 할 수 있다는 것이다. 하지만 애플릿의 보안 때문에 제약 사항이 따른다.
앞에서 만든 채팅 클라이언트 프로그램(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. 공개 방, 비밀 방, 귓말 보내기 기능이 있는 채팅 서버/클라이언트 프로그램을 설계해보자. 클라이언트와 서버의 통신을 그림으로 나타내보자.