Java를 이용해서 클라이언트 쪽 채팅을 만들어 보자.

우선 웹에서 채팅이 가능해야 하기 때문에 Applet를 사용하여야 한다.

그리고 HTML 페이지를 이용하여 화면을 보여 줄것임으로. DHTML을 사용하면 된다.

javascript를 사용하여 DHTML 객체(?)에 write를 해 주는 방법을 쓰면
리프레쉬가 없이 화면을 보여 줄 수 있다.
( 여기서 JSObject 라는 클래스를 사용하여야 한다. )

채팅에서 보내지고 받아 오는 데이타는 모두 숨겨진 프레임에 있는 애플릿을 이용한다.
물론 채팅에 쓰여질 스크립트 역시 숨겨진 프레임에 있으면 될 것이다.

보내는 데이타일 경우에는 자바 스크립트를 이용해서  숨겨진 애플릿으로 데이타를 전송한다.

그리고 받는 데이타의 경우에는 애플릿으로 데이타를 받고,
받은 데이터에 따른 자바 스크립트를 실행 시켜 주어서 화면에 출력 또는
또 다른 작업 ( 로그아웃(이것은 서버에서 처리) 메세지라면
화면을 닫아주는것(이것은 클라이언트의 자바스크립트가 실행)) 을 할것이다.

서버의 사용량을 최소한으로 줄이기 위해 모든 자료들은
최대한 자바 스크립트를 이용해서 처리를 해야 하며
서버는 단지 최소한의 자료만을 처리하고 전송해야 한다.
( 많은 사용자가 채팅을 할 수도 있으므로... )


간단한 자바 소스들을 보면서 이야기를 진행해 보자.
( 여기서 사용된 소스는 http://netb.co.kr 에 있는 채팅 소스를 이용한 것임을 밝힌다. )


애플릿에서는 소켓을 이용해 데이터를 전송한다.
간단한 예제:
chatSocket = new Socket(host, port);
out = new PrintWriter(chatSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(chatSocket.getInputStream()));        

보낼때는 그냥 이미 만들어진 out 스트림을 이용해서 데이터를 전송해 준다.
간단한 예제 :
public void send(String pStr)
{
        out.println(pStr);
}


애플릿이 데이터를 수신할때에는, 데이터가 언제 날아 올지 알 수 없으므로
스레드를 이용해서 항상 데이터를 받을 준비를 하고 있어야 한다.
간단한 예제 :
public void connect(String host, int port)
{
           .......
        Thread thd;
        thd = new Thread(this);
        thd.start();        
           ........
}

public void run()
{
        try
        {
                while(true)
                {
                        //RecvProcess(in.readLine());                
                        RecvProcess(new StringTokenizer(in.readLine(), sep));        
                }                                        
        }catch (IOException e){
                disconnect();
        }
}


데이터 수신에 문제가 생겼다면 disconnect() 해 준다.
(위의 예제에서 try ~ catch 부분임 )
물론 다른 사용자들에게 이 사람이 접속을 끊었다 또는 자신이 접속을 끊는다는것을
서버에게 알려 준뒤 in 과 out 두개의 스트림을 닫아 주고 socket의 연결도 닫아야 할 것이다.
간단한 예제 :
public void disconnect()
{
        if (bConnected == true)
        {
                send("exit" + sep + client.strID + sep + client.strRoomname + "\n");
                try
                {
                        out.close();
                        in.close();
                        chatSocket.close();
                }catch (IOException e){}

                bConnected = false;
        }
}        


제대로 된 데이터가 들어 왔다면 거기에 맞게 각 항목을 실행 시켜 주면 된다.
public void RecvProcess(StringTokenizer token)
{
              ......
        else if (mode.equals("introduce"))
        {
                client.RecvIntroduce(user, info1);
        }
              ......
}


여기에서 client는 역시 클래스이며 실제적인 채팅 클라이언트가 들어 있다.
간단한 예제 ( Client.java ) :
public class Client extends Applet ;

위에서와 같이 Applet로 이루어져 있다. ( 그러므로 당연히 HTML에서도 이것을 불러 올 것이다. )

client.RecvIntroduce(user,info1)을 실행 하면 아래와 같은 코드가 실행이 된다.
간단한 예제 ( Client.java ) :
public void RecvIntroduce(String pUser, String pStr)
{                                        
        win.eval("WriteIntroduce(\"" + pStr + "\")");
}

이 코드는 win의 객체에 eval를 이용해서 WriteIntroduce("소개");를 실행 시키게 된다.
여기서 win객체는
public JSObject win;
win = (JSObject)JSObject.getWindow(this);  
로 되어 해당 프레임을 선택하도록 했다.

WriteIntroduce("소개"); 부분은 (html 프레임이기 때문에)당연히
자바 스크립트로 이루어져 있을 것이다.
간단한 예제 ( applet.php ) :
function WriteIntroduce(pMsg)
{
          ......
        top.main.document.write("</td>");
          ......
}
그러므로 접속한 모든 채팅 클라이언트들의 화면에 소개가 나갈 것이다.

화면을 제일 아래로 자동으로 스크롤 시키는 것도 빼 먹으면 안 될 것이다.
간단한 예제 :
function SetScroll()
{
        //top.main.document.write("<script>scroll(0,1000000);<\/script>\n");
        top.main.scrollBy(0,top.main.document.body.scrollHeight);
}



만약 내가 소개를 보내다고 해 보자.

내 소개를 보내기 위해 특정 버튼 또는 명령을 클릭했을때 다음과 같은 구문이 실행 될것이다.
다음을 실행 시키면 될것이다.
간단한 예제 :
<script>
    var msg;
    msg = "<table border='0' cellspacing='0' cellpadding='0'>";
    msg += "<tr>";
    top.ChatApplet.chat.SendIntroduce(escape(msg));
</script>

여기 ChatApplet.chat.SendIntroduce 에서
chat는 애플릿의 이름이며 top.ChatApplet는 프레임 명이다.
즉 top.ChatApplet에 있는 chat라는 애플릿에서 ( Client.class )
SendIntroduce(..)라는 메소드를 실행 시키게 되는 것이다.

이제 SendIntroduce() 메소드의 동작을 보도록 하자.
간단한 예제 (Client.java) :
public void SendIntroduce(String pStr)
{                
        client.send("introduce" + sep + strID + sep + pStr + "\n");                
}

여기서의 client는 ChatClient client; 라고 선언 되어 있다.
간단한 예제 ( ChatClient.java ) :
public void send(String pStr)
{
        out.println(pStr);
}

다시 out 스트림(소켓으로 연결 되어있음)으로 데이터를 전송한다.
( 여기서 알 수 있듯이 서버와의 모든 데이터 송 수신은 ChatClient 가 한다. )
( 단지 Client는 어떻게 동작하고 어떻게 자바 스크립트를 실행 시켜 줄것인가를 결정한다. )

서버쪽에서는 현재 같은 방에 접속 되어 있는 모든 사람에게 해당 메세지를 뿌려준다.
물론 저기 위에 설명한 방법대로 데이터가 넘어 오고 화면에 출력 될것이다.


그리고 다음은 애플릿을 화면에 보여 주기 위한 예제이다.

간단한 예제:
<applet code="Client.class" MAYSCRIPT codebase="applet" width=100 height=100 name='chat'>

위와 같이 불러 온다.
여기서 MAYSCRIPT라는 것은 자바 스크립트와 연동을 위해서 필요한 부분이라고 한다.



많은 도움이 되기를.
즐거운 하루~~!

다시 한번 말하지만. http://netb.co.kr 에 있는 채팅 소스를 이용한 설명 입니다.
문자삐삐 메신저 아르바이트에서 생긴일


안녕하세여~~

징징이에여~~

원래 진진인뎅 li 희망선택~~~

예전에 잠깐 문자삐삐 메신저 알바를 했었는데.

참 재미있던일이 많았어여!!

문자삐삐 메신저는 문자삐삐를 치는 사람의 목소리를 듣고

그것을 글로 처서 삐삐에 전송해주는 역할입니다.

사용자들이 20초 정도 녹음하고 그것을 그대로

녹취해서 글로써 보내는 역할을 하는거죠..

그런데 회사 방침에 의해서 절대 욕을 써서 보내선 안되죠..

삐삐치는 사람들이

"야! 이 X만한 새끼야! 죽을래? 어디 처박혀있어 씨X (X발)! 빨리 연락해!"

라고 녹음하면.

"어디있냐? 빨리 연락해" 등으로 축소 시켜서 문자를 전송해주어야 되죠.

또 욕만 하다가 끊는 경우가 있는데. 그것은(너무 심한경우는)

(음성메시지 확인바람)이란 말을 전송해주죠..

넘 황당&당황&어처구니없음을 느낀 메시지 녹음을 보여드리겠어여~~ 공개~~


"야! 너 이X새끼야! 너 걔랑 X구리(빠X리) 떴지! 죽여버리겠어?"

문자메시지 전송->
혹시 너 바람 피웠니? 혼날래? (음성메시지 확인바람)

"아따 쓰블름 마빡의 심줄을 뽑아서 기타줄로 튕겨뿐다! 빨리 연락하그래이~!"

문자메시지 전송->
이마에 힘줄을 뽑아주기 전애 연락해죠

"(남자목소리로) 나 미영인데. 난 너랑 이제 더이상 만나기 싫어! 연락도
하지마!"

문자메시지 전송->
나 미영인데. 난 너랑이제 더이상 만나기 싫어! 연락하지마!
(남자목소리임)

점점 일하다 보니깐

장난끼가 발동해서 약간 장난좀 쳤습니다..

이히히 아래 또 보면.

"병풍뒤에서 향냄새 맡기 싫으면 올때 CD 꼭 가져와"

문자메시지 전송->
올때 꼭 CD가져와 (상당히 벼루고 계심)

"형님! 당했습니다! 사시미가 빠구리한테 칼빵을 맞았뎁니다!"

문자메시지 전송->
형! 당했어요! 칼이 성관계(?)한테 칼에 찔렸데요

"너 오늘도 안사오면 죽여버릴꺼야! 이개새끼야! 벌써 몇일째야!"

문자메시지 전송->
너 오늘도 안사오면 혼나! 이 강아지야! 벌써 몇일째야!

이 강아지야.. 그거 한번했더니 우리 상무님이 뭐라고 막 혼내시더라고요..

제일 황당한 음성은!!

갑자기 어느 여자가 "으아!!!!!" 하더니 비명을 지르고 끊는거에요.

어떻게 하겠어요,... 위급한 상황같으니 알려줘야 겠더라구여..

문자메시지 전송->
긴급<<어느 여성이 큰 신음소리를 지르며.. 위급한 상황같아요>>
빨리 어떻게든 해보새여.. (음성메시지 확인바람)

걱정되서 한사람한테 꼐속 보냈죠..

황당하더라구요.어떻게 됐을까...아하핫..

여러분 행복하세여





-하이텔 / 보낸이:TgThKim (김태균 )

출처 : http://www.humoruniv.com/hwiparambbs/read.php?pri=0&table=new&best=&page=1&sort=&number=424&tableid=humor01&ref=411&divfire=

'재미' 카테고리의 다른 글

[추천] 매트릭스 핑퐁  (0) 2003.07.15
박카스 CF의 문제점.  (0) 2003.07.12
[펌] 문자삐삐 메신저 아르바이트에서 생긴일  (0) 2003.07.09
가공할 협박  (0) 2003.07.09
일본인이 보는 한국  (0) 2003.07.06
미운 당근 자식  (0) 2003.06.25
테러리스트들이 여야 정치인으로 가득 찬 비행기를 공중납치했다. 그들은 관제탑에 여러 가지 요구사항을 말하면서 이렇게 덧붙였다.
 
"만약 요구조건을 들어주지 않으면 1시간에 1명씩 풀어 놓겠다."

'재미' 카테고리의 다른 글

박카스 CF의 문제점.  (0) 2003.07.12
[펌] 문자삐삐 메신저 아르바이트에서 생긴일  (0) 2003.07.09
가공할 협박  (0) 2003.07.09
일본인이 보는 한국  (0) 2003.07.06
미운 당근 자식  (0) 2003.06.25
희한한 공식 (different equation)  (0) 2003.06.24

하하.
* Chan님에 의해서 게시물 이동되었습니다 (2003-07-06 15:57)

'재미' 카테고리의 다른 글

박카스 CF의 문제점.  (0) 2003.07.12
[펌] 문자삐삐 메신저 아르바이트에서 생긴일  (0) 2003.07.09
가공할 협박  (0) 2003.07.09
일본인이 보는 한국  (0) 2003.07.06
미운 당근 자식  (0) 2003.06.25
희한한 공식 (different equation)  (0) 2003.06.24


^^
* Chan님에 의해서 게시물 이동되었습니다 (2003-07-06 15:57)

'재미' 카테고리의 다른 글

박카스 CF의 문제점.  (0) 2003.07.12
[펌] 문자삐삐 메신저 아르바이트에서 생긴일  (0) 2003.07.09
가공할 협박  (0) 2003.07.09
일본인이 보는 한국  (0) 2003.07.06
미운 당근 자식  (0) 2003.06.25
희한한 공식 (different equation)  (0) 2003.06.24
romance mathematics
(로맨스 수학)
smart man + smart woman = romance
(똑똑한 남 + 똑똑한 녀 = 로맨스)
smart man + dumb woman = affair
(똑똑한 남 + 멍청한 녀 = 불륜)
dumb man + smart woman = marriage
(멍청한 남 + 똑똑한 녀 = 결혼)
dumb man + dumb woman = pregnancy
(멍청한 남 + 멍청한 녀 = 임신)

office arithmetic
(사무 공식)
smart boss + smart employee = profit
(똑똑한 사장 + 똑똑한 직원 = 수익)
smart boss + dumb employee = production
(똑똑한 사장 + 멍청한 직원 = 생산)
dumb boss + smart employee = promotion
(멍청한 사장 + 똑똑한 직원 = 승진)
dumb boss + dumb employee = overtime
(멍청한 사장 + 멍청한 직원 = 초과 근무)

shopping math
(쇼핑 산수)
a man will pay $2 for a $1 item he needs.
(남자는 필요한 $1짜리 물건을 $2에 산다.)
a woman will pay $1 for a $2 item that she doesn
(여자는 필요없는 $2짜리 물건을 $1에 산다.)

general equations & statistics
(전반적인 공식과 통계들)
a woman worries about the future until she gets a husband.
(여자는 미래에 대한 걱정을 한다. 남편을 얻을 때까진.)
a man never worries about the future until he gets a wife.
(남자는 미래에 대한 걱정을 전혀 하지 않는다. 부인을 얻을 때까진.)
a successful man is one who makes more money than his wife can spend.
(자기의 부인이 쓰는 것보다 많이 버는 남자를 우리는 성공한 남자라 칭한다.)
a successful woman is one who can find such a man.
(그런 남자를 찾은 여자를 우리는 성공한 여자라 칭한다.)

happiness
(행복)
to be happy with a man, you must understand him a lot and love him little.
(남자와 행복하기 위해서 당신은 그를 많이 이해하고 사랑은 조금 해야 한다.)
to be happy with a woman, you must love her a lot and not try to understand her at all.
(여자와 행복하기 위해서 당신은 그녀를 많이 사랑하고 절대 이해하려 해서는 안된다.)

appearance
(외모)
men wake up as good-looking as they went to bed.
(남자는 잘려고 누웠을때와 같은 모습으로 일어난다.)
women somehow deteriorate during the night.
(여자는 왠지 자는 동안 좀 썩은 듯 하다.)

propensity to change
(변화의 경향)
a woman marries a man expecting he will change, but he doesn
(여자는 남자가 변할거라 예상하고 결혼한다. 하지만 그는 변하지 않는다.)
a man marries a woman expecting that she won change, and she does.
(남자는 여자가 변하지 않을거라 예상하고 결혼한다. 하지만 그녀는 변한다.)

discussion technique
(토론의 미학)
a woman has the last word in any argument.
(어떠한 말싸움에서도 마지막 말을 하는 사람은 여자다.)
anything a man says after that is the beginning of a new argument.
(그 이후에 남자가 어떤 말을 한다면, 그것은 새로운 말싸움의 시작이다.)
* Chan님에 의해서 게시물 이동되었습니다 (2003-07-06 15:57)

'재미' 카테고리의 다른 글

박카스 CF의 문제점.  (0) 2003.07.12
[펌] 문자삐삐 메신저 아르바이트에서 생긴일  (0) 2003.07.09
가공할 협박  (0) 2003.07.09
일본인이 보는 한국  (0) 2003.07.06
미운 당근 자식  (0) 2003.06.25
희한한 공식 (different equation)  (0) 2003.06.24

+ Recent posts