2008년 11월 17일
1:1 채팅 프로그램 예제.
그럼 가장 먼저 해야 할 것은 설계 입니다. 채팅 프로그램이 어렵지는 않지만 처음 만들어 보는 것이라면 어떤 구조로 동작 할 것인지 설계를 하는 편이 좋습니다.
그럼 간단하게 설계를 하도록 합시다.
가장 먼저 java.net 패키지에서 어떤 클래스들을 사용해야 할지를 생각해 봅시다.
보통 기본 예제로 배우기 쉬운 것이 ServerSocket 클래스와 Socket 클래스를 이용한 에코서버 만들기 또는 메시지를 전달 할 수 있는 예제일 것입니다.
우리는 이 점을 이용해서 Socket클래스와 ServerSocket 클래스를 활용할 것이므로 메시지를 받을 때는 ServerSocket 클래스를 이용하고 메시지를 보낼 때는 Socket 클래스를 이용하면 됩니다.
두번 째로 채팅 프로그램에서 메시지를 주고 받는 방식에 대한 세부적인 설계가 필요합니다. java.net 패키지를 이용해서 어떻게 주고 받을 것인가를 간략하게 설계 했으나 메시지를 주고 받게 되는 것은 텍스트/바이트 스트림입니다.
메시지를 송신 할 때는 출력에 해당 하므로 PrintWriter 클래스를 활용할 것입니다.
그렇다면 당연히 메시지를 수신 할 때는 입력에 해당 하므로 BufferedReader 클래스를 활용할 것입니다.
세번 째로는 위에 두가지를 조금 정리 하도록 하겠습니다.
메시지를 받을 때는 ServerSocket 클래스를 사용합니다. 이 동작은 메시지 수신에 해당하는 동작이므로 BufferedReader 클래스와 같이 동작해야 합니다.
메시지를 보낼 때는 Socket 클래스를 사용합니다. 이 동작은 메시지 송신에 해당하는 동작이므로 PrintWriter 클래스와 같이 동작해야 합니다.
네번 째로는 송수신이 동시에 동작해야 합니다. 수신을 하면서도 송신이 가능해야 하므로 멀티쓰레드를 이용하는 편이 좋습니다.
조금 더 자세하기 이야기를 하자면 송신을 하는 방법은 송신을 해야 할 때만 송신을 하면 되는 것이므로 큰 문제가 없으나 수신의 경우에는 언제나 받을 준비가 되야 하기 때문에 수신을 위한 동작이 돌고 있어야 하면서도 송신도 가능해야 합니다.
만약에 이 동작이 단일 쓰레드 라면 이 부분에서 문제가 될 소지가 있습니다. 내가 메시지를 보내는 사이에 수신을 해야 한다면 어떻게 될까요?
일단 무식한 결론을 내리겠습니다. 단일 쓰레드를 이용해도 컴퓨터의 동작 빠르기 때문에 큰 문제가 없을 듯 합니다. 그러나 메시지를 받는데 1분이 걸리고 메시지를 보내는데 1분이 걸린다고 가정 했을 때는 단일 쓰레드의 경우에는 이부분에서 2분이라는 시간을 소요하게 됩니다.
멀티 쓰레드라면 보내는 것과 받는 것이 동시에 동작하므로 1분이 걸리게 되는 것이지요.
또한 다수의 채팅방에 경우에 여러 사람이 메시지를 전달 할 때 단일 쓰레드로 처리 하면 발생하는 문제가 있기 때문입니다. 100명이 메시지를 전달 한다면 마지막 메시지는 출력되는데 오래 걸리겠지요..
(여기서 전이중 통신 반이중 통신 등 네트워크와는 상관 없이 멀티쓰레드를 위한 예 이므로 네트워크적인 요소는 일단 접어두고 생각하셔야 합니다.)
마지막으로는 적절한 인터페이스와 몇번 포트를 사용할 것인가를 정해야 합니다. 인터페이스 구성은 프로그램을 짜는 사람마다 다르므로 예제는 그림으로 보여드리도록 하겠습니다.

1. ServerSocket 클래스는 메시지를 받을 때 사용한다.
2. Socket 클래스는 메시지를 보낼 때 사용한다.
3. 송신은 PrintWriter 클래스 사용, 수신은 BufferedReader 클래스 사용.
4. 송신과 수신은 동시에 동작할 수 있어야 한다.(멀티쓰레드 이용)
5. 적절한 인터페이스 구성과 사용할 포트번호를 정한다.
이를 간단하게 클래스 다이어그램으로 그리면 아래와 같습니다.
OneToOneChat - JFrame(상속), Runnable(구현), ActionListenet(구현) |
-Socket serversocket -ServerSocket server -BufferedReader in -PrintWriter out 적절한 인터페이스... |
+OneToOneChat() +setServer() : void +process() : void +run() : void +send() : void +exit() : void +actionPerformed(ActionEvent e) : void |
간략하게 설명을 하자면
OneToOneChat 클래스 하나로 구현이 가능합니다. 쉽기 때문이지요.
생성자를 이용해서 인터페이스를 구성합니다.
setServer() 메소드는 server 객체에 포트번호 10000번을 인수로 하는 ServerSocket 생성자를 이용해 셋팅을 해줍니다.
process() 메소드는 serversocket 객체를 이용해서 언제든지 메시지를 받을 수 있도록 설정합니다. 이 메소드가 하는 일은 상대방으로부터 메시지를 수신하는 역할을 합니다.
run() 메소드는 Runnable 인터페이스를 구현 한 것입니다. 이 메소드는 setServer(), process() 메소드를 동작 시키는 역할을 합니다.
send() 메소드는 sendsocket 객체를 이용해 메시지를 송신 하는 역할을 합니다.
exit() 메소드는 프로그램을 종료하면 상대방에게 프로그램을 종료 했다는 메시지를 보내고 프로그램 동작을 종료 하는 역할을 합니다.
actionPerformed(ActionEvent e) 메소드는 ActionListenet 인터페이스를 구현 한 메소드 입니다. 메시지를 전달 하는 send() 메소드를 동작 시키는 역할을 합니다.
기타..
프로그램 종료 이벤트는 무명 클래스로 동작하고 WindowAdapter 클래스를 이용합니다. 동작 시키는 이벤트는 exit() 메소드를 동작 시키는 역할을 합니다.
대화 상대가 없을 경우에 Exception을 발생 시켜 "호스트는 오프라인 또는 존재하지 않을 수도 있습니다." 메시지를 출력하도록 합니다.
멀티 쓰레드를 이용하므로 메인메소드와 run() 메소드는 동시에 동작 해야 합니다.
이것으로 필요한 설계에 조건은 대부분 다 모인 듯 합니다.
이제 이와 비슷한 토대로 작성을 하고 동작 되는지를 확인합니다.
그리고 소스를 아래 파일을 참고 하시기 바랍니다.
OneToOneChat.java
# by | 2008/11/17 20:22 | 정리할 자료들 | 트랙백 | 덧글(1)
◀ 이전 페이지다음 페이지 ▶



