HTML5 Server Sent Events 를 이용한 웹채팅 Prototype.

ITWeb/개발일반 2012. 3. 15. 17:04
고민 하다가 걍.. 부재중 메시지나 아니면.. 읽기 전에 메시지를 연속으로 보냈을때 오류를 방지 하기 위해서.. 아래 처럼 코드 살짝 수정했습니다. ^^;

[status.html]

<?php

header('Content-type: text/event-stream');

header('Content-Transfer-Encoding: UTF-8');

header('Connection: keep-alive');


$file = $_GET['f'];


echo file_get_contents($file);

file_put_contents($file, '', LOCK_EX);

flush();

?>



[messages.html]

<?php

$sender = $_GET['sender'];

$receiver = $_GET['receiver'];

$message = $_GET['message'];


$sendMessage = "\n\n" . 'id: ' . time() . "\n\n" . 'data: {sender:"' . $sender . '", receiver:"' . $receiver . '", message:"' . $message . '}' . "\n\n";


file_put_contents($receiver . '.txt', $sendMessage, FILE_APPEND|LOCK_EX);

?>




정말이지 완전 쌩초보 프로토타입이니 걍.. 참고만 하시길 바라며.. 
전혀 웹서버에 대한 과도한 traffic 에 대해서 고려되지 않은 내용임을 밝힙니다... ㅋㅋ
(SSE 도 결국은 http request 방식을 사용하기 때문에 traffic 부하가 있습니다.)

해야 할건 무지 많습니다.
기본 chatting message 에 대한 structure 도 만들어야 하고 traffic 에 대한 분산을 어떻게 할지도 고민해서 만들어야 하고...등등.. 
걍.. 맛보기이니.. 나머지는 각자 알아서 만들어 보세요.. ^^;;


[참고문서]


[실행화면]



[구조소개]

[chat.html]
- 대화 상대를 선택하게 되면 열리는 채팅창입니다.

[status.html]
- EventSource 에서 이벤트를 받을 서버 URL 입니다.

[messages.html]
- XHR 을 이용해서 메시지를 전송할 서버 URL 입니다.
- 이넘이 입력한 메시지를 받아서 기록하게 됩니다. 



[소스코드 - chat1.html]


[소스코드 - chat2.html]
- 아래 코드만 chat1.html 과 다릅니다.

var messageVO = {

sender:'jjeong',

receiver:'henry',

message:''

}


var eventSource = new EventSource('http://localhost/status.html?f=jjeong.txt');



[소스코드 - status.html]

<?php

header('Content-type: text/event-stream');

header('Content-Transfer-Encoding: UTF-8');

header('Connection: keep-alive');


$file = $_GET['f'];
 

echo file_get_contents($file);

flush();

?>



[소스코드 - messages.html]

<?php

$sender = $_GET['sender'];

$receiver = $_GET['receiver'];

$message = $_GET['message'];


$sendMessage = "\n\n" . 'id: ' . time() . "\n\n" . 'data: {sender:"' . $sender . '", receiver:"' . $receiver . '", message:"' . $message . '}' . "\n\n";


file_put_contents($receiver . '.txt', $sendMessage, LOCK_EX);

?>

 
: