반응형

이전 포스팅에 더 기능을 확장해 보겠다. websocket으로 client가 수신하는 내용은 캡춰하기 위해 openfire-websocket client 라이브러리의 this._ws.send 부분을 찾아서 다음과 같이 console.log("Send:"+xml)을 앞에 추가해 준다.sendRaw 함수와 send 함수 부분이다.



5. 상태 업데이트

상태를 웹에서 업데이트 하도록 해보겠다. presence에는 <show/>, <status/>, <priority/> 엘리먼트를 가진다. 

1) <show/> 엘리먼트

away, chat, dnd, xa 값을 가진다. dnd는 do-not-disturb 의 약자로 busy를 의미, xa는 eXtended Away의 약자로 away 보다 더 긴 시간 이후의 자리비움을 뜻한다. away는 잠시 자리 비움을 뜻함.

2)<status/> 엘리먼트

status는 현재 상태에 대한 description 으로 text로 설정한다.

3) <priority/> 엘리먼트

-128에서 127까지의 정수값으로 routing에 대한 우선순위를 지정한다. 엘리먼트가 없을 경우 이 값은 0이다.

상태 정보를 업데이트 하기 위해서 이전 포스팅의 chat_app.js 에 다음을 추가한다.

다음은 chat.html에 접속해서 변경해본 결과이다.

presence 엘리먼트를 보내는 것을 볼 수 있다.


6. 상대방 상태 가져오기

등록한 친구의 상태를 가져오려면 handler를 만들어야 한다. presenceHandler를 다음과 같이 만든다.

이 handler를 connection객체에 등록한다. connectionHandler에서 connected 상태일경우 등록한다.

addHandler 함수는 addHandler: function (handler, ns, name, type, id, from, options) 로 정의되는데 (Function)Handler는 사용할 callback, (String)ns는 match되는 namespace, (String)name은 match되는 stanza 이름, (String)type 은 match되는 stanza type attribute, (String)id는 stanza id, (String)from 은 from, (String)options은 Handler 옵션을 의미한다. 여기에서는 presence라는 이름의 stanza의 메시지가 오면 handler를 호출하도록 하였다.

다음은 웹으로 로그인하고 Spark의 친구를 자리비움으로 바꿨을 경우 출력되는 화면이다.



7. 채팅 메시지 수신

채팅 메시지는 message 엘리먼트의 chat 타입으로 전달된다. 채팅 메시지를 수신하려면 message 엘리먼트의 chat 타입을 처리할 핸들러를 등록하면 된다. 다음과 같이 핸들러를 작성하고 connection에 핸들러를 등록한다.



8. 채팅 메시지 송신

채팅 메시지는 message 엘리먼트의 chat type으로 생성하고 그 안에 <body>메시지내용</body>를 넣어서 전송하면 된다. 다음은 채팅 UI를 만들고 전송하는 코드이다.

메시지를 spark 메신저와 주고받을수 있다. 물론 웹 브라우저를 하나 더 열어서 웹 브라우저에서도 서로 채팅이 가능하다.


9. Ping/Pong 메시지

연결을 유지하기 위해 Ping/Pong 메시지를 서로 교환한다. 핑/퐁은 iq 스탠자를 이용한다. iq 스탠자는 info/query의 약자이다. request-response 메커니즘으로 동작한다. type은 get, set, result, error 가 있다. ping 메시지는 get type의 iq메시지에 <ping xmlns="urn:xmpp:ping"/>을 보내는 것이다. ping/pong 메세지 예는 다음과 같다.

다음은 ping메시지에 대해서 pong으로 응답하는 핸들러 코드와 핸들러를 등록하는 코드이다.



반응형
Posted by alias
,