WebSocket ตอนที่ 4 : Client เชื่อมต่อ Servcies ของ WebSocket การรับ-ส่งข้อมูล Real Time ด้วย PHP

http://www.thaicreate.com/php/php-websockets-client.html

 

WebSocket ตอนที่ 4 : Client เชื่อมต่อ Servcies ของ WebSocket การรับ-ส่งข้อมูล Real Time ด้วย PHP หลังจากที่เราได้ทำการสร้าง Services ของ WebSockets ของ Server เรียบร้อยแล้ว ขั้นตอนถัดไปคือการเขียนฝั่ง Client เพื่อจะทำการเชื่อมต่อและรับ-ส่ง ข้อมูลแบบ Real time และก่อนการเชื่อมต่อด้วย Client ในส่วนของ Server จะต้องทำการรัน Services ของ WebSockets ให้ทำงานตลอดเวลา เพราะ Service ตัวนี้จะทำหน้าที่ในการตรวจสอบการเชื่อมต่อและ Push รายการข้อความใหม่ๆ ไปยัง Client

ในการเชื่อมต่อจากก Client ไป Services ของ WebSocket ที่อยู่ในฝั่ง Web Server จะใช้คำสั่งของ JavaScript ในการเชื่อมต่อ ซึ่งรูปแบบการเชื่อมต่อนั้นเป็นคำสั่งที่ง่าย ๆ เพียงเปิด Connection ทำการเชื่อมต่อ และก็ตามด้วยการ Implements ตัว method หรือ event ที่ทำหน้าที่เปลี่ยนเหมือน callback คอยรับคำสั่งต่างๆ ที่ถูกส่งมาจาก Server


 

 


เริ่มต้นด้วยการเปิด Connection เพื่อเชื่อมต่อไปยัง Services ของ WebSocket

1.// Open Connection
2.socket = new WebSocket('ws://localhost:8089');

Implements Event

01.// This event occurs when socket connection is established.
02.socket.onopen = function(e) {
03. 
04.};
05. 
06.// This event occurs when client receives data from server.
07.socket.onmessage = function(e) {
08.onMessage(e)
09.};
10. 
11.// This event occurs when there is any error in communication.
12.socket.onerror = function(e) {
13.onError(e)
14.};

โดย

socket.onopen : เมื่อเชื่อมต่อสำเร็จจะทำงานที่ Event นี้
socket.onmessage : เป็น Event เมื่อ Server ส่งข้อมูล Real time กลับมา ซึ่ง Event นี้จะทำงานทุกๆ ครั้งที่มีข้อมูลถูกส่งเข้ามา
socket.onerror : เป็น Event เมื่อโปรแกรมทำงานผิดพลาด

เมื่อกต้องการส่งข้อความไปยัง Server

1.socket.send(strMessage);

ตัวอย่าง

WebSocket Client Server

สร้างไฟล์ index.php เข้ามาในโปรเจค

index.php

001.<!DOCTYPE html>
002.<html>
003.<head>
004.<title>PHP WebSocket Chat</title>
005.<link type="text/css" rel="stylesheet" href="style.css" />
006.<script src="jquery-1.7.2.min.js"></script>
007.</head>
008. 
009.<style type="text/css">
010. 
011.body {
012.font:12px arial;
013.color: #222;
014.text-align:center;
015.padding:35px;
016.}
017. 
018.#chatbox {
019.text-align:left;
020.margin:0 auto;
021.margin-bottom:25px;
022.padding:10px;
023.background:#fff;
024.height:270px;
025.width:430px;
026.border:1px solid #ACD8F0;
027.overflow:auto;
028.}
029. 
030.</style>
031.<body>
032.<div id="ws_support"></div>
033.<div id="wrapper">
034.<div id="menu">
035.<h3 class="welcome">PHP Web Chat</h3>
036.</div>
037.<div id="chatbox"></div>   
038.Name <input name="txtName" type="text" id="txtName" size="10"/>
039.Message <input name="txtMessage" type="text" id="txtMessage" size="35"placeholder="" />
040.<input name="btnSend" type="button"  id="btnSend" value="Send" />
041.</div>
042.</body>
043.</html>
044. 
045.<script language="javascript">
046. 
047.var socket;
048. 
049.function webSocketSupport()
050.{
051.if (browserSupportsWebSockets() === false) {
052.$('#ws_support').html('<h2>Sorry! Your web browser does not supports web sockets</h2>');
053.$('#wrapper').hide();
054.return;
055.}
056. 
057.// Open Connection
058.socket = new WebSocket('ws://localhost:8089');
059. 
060.socket.onopen = function(e) {
061.writeMessage("You have have successfully connected to the server");
062.};
063. 
064.socket.onmessage = function(e) {
065.onMessage(e)
066.};
067. 
068.socket.onerror = function(e) {
069.onError(e)
070.};
071. 
072.}
073. 
074.function onMessage(e) {
075.writeMessage('<span style="color: blue;"> ' + e.data + '</span>');
076.}
077. 
078.function onError(e) {
079.writeMessage('<span style="color: red;">Error!!</span> ' + e.data);
080.}
081. 
082.function doSend() {
083. 
084.if ($('#txtName').val() == '') {
085.alert('Enter your [Name]');
086.$('#txtName').focus();
087.return '';
088.} else if ($('#txtMessage').val() == '') {
089.alert('Enter your [Message]');
090.$('#txtMessage').focus();
091.return '';
092.}
093. 
094.var strMessage = '@<b>' + $('#txtName').val() + '</b>: ' + $('#txtMessage').val();
095.socket.send(strMessage);
096.writeMessage(strMessage);
097. 
098.$('#txtMessage').val('');
099.$('#txtMessage').focus();
100.}
101. 
102.function writeMessage(message) {
103.$('#chatbox').append(message + '<br>');
104.}
105. 
106.function browserSupportsWebSockets() {
107.if ("WebSocket" in window)
108.{ return true; }
109.else
110.return false; }
111.}
112. 
113.$(document).ready(function() {
114.webSocketSupport();
115.});
116. 
117.$('#btnSend').click(function () {
118.doSend();
119.});
120. 
121.</script>

จากตัวอย่างนี้เป็นรูปแบบการทำงานแบบง่าย ๆ คือ ให้ User ทำการ ส่งข้อความพูดคุย Chat ระหว่างกัน

ทดสอบการทำงาน

WebSocket Client Server

ก่อนการทำงานจะต้องทำการ Run ตัว Servces ทิ้งไว้ซะก่อน

WebSocket Client Server

รันโปรแกรม

WebSocket Client Server

เนื่องจากเราจะทดสอบระบบ Chat ให้ทดสอบเปิดหน้าจอหลายๆ หน้าจอ และใช้ชื่อในส่วนของ Name ที่แตกต่างกัน

WebSocket Client Server

ทดสอบการส่ง Message จากหน้าจอใดหน้าจอหนึ่ง

WebSocket Client Server

จะเห็นว่าทุกๆ Client จะได้รับข้อความแบบ Real time ทันที

WebSocket Client Server

ทดสอบการ Client อื่นๆ ก็จะได้ผลลัพธ์เช่นเดียวกัน

WebSocket Client Server

เมื่อตรวจสอบที่ Services จะเห็นว่ามี Log เกิดขึ้น ซึ่งเกิดจาก function onMessage ที่อยู่ในไฟล์ Connection.php

Note!. จากตัวอย่างนี้จะเห็นว่า Client ที่ส่งออกจะไม่ได้รับในส่วนของ Event ของ socket.onmessage ซึ่งในกรณีที่ต้องการให้ Client ที่ส่งได้รับ Event นี้ด้วยให้ไปแก้ในส่วนของ Connection.php จาก

01.public function onMessage(ConnectionInterface $from, $msg) {
02.$numRecv = count($this->clients) - 1;
03.echo sprintf('Connection %d sending message "%s" to %d other connection%s' . "\n"
04., $from->resourceId, $msg, $numRecv, $numRecv == 1 ? '' : 's');
05. 
06.foreach ($this->clients as $client) {
07.if ($from !== $client) {
08.// The sender is not the receiver, send to each client connected
09.$client->send($msg);
10.}
11.}
12.}

เป็น

01.public function onMessage(ConnectionInterface $from, $msg) {
02.$numRecv = count($this->clients) - 1;
03.echo sprintf('Connection %d sending message "%s" to %d other connection%s' . "\n"
04., $from->resourceId, $msg, $numRecv, $numRecv == 1 ? '' : 's');
05. 
06.foreach ($this->clients as $client) {
07.// The sender is not the receiver, send to each client connected
08.$client->send($msg);
09.}
10.}

และในกรณีที่ต้องการเขียนเงื่อนไขอื่นๆ เพิ่มเติม เช่น จัดเก็บข้อมูลลงใน Database หรือจะส่งให้เฉพาะ Client อาจจะต้องทำการตรวจสอบ $from กับ $msg ที่ส่งมาว่า มีเงื่อนไขอย่างไรบ้างที่จะเลือกเฉพาะบาง Client ได้ เช่น ส่ง $msg ที่เป็น json ที่ประกอบด้วย to,message

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *