php – swoole – 架設 websocket 進階範例

看過 上一篇(swoole 架設 websocket 範例) 後,應該都有概念了,這次用非常簡單的程式碼建立一個範例,會讓你更有感覺資料的傳送/接收。

影片範例

Composer

使用 jsnlib/swoole 輔助工具來簡化 onMessage 事件。

"require": {
    "jsnlib/swoole": "^1.0"
}
composer update

 

Swoole.php

<?php
require_once 'vendor/autoload.php'; 

// 建立 websocket 物件,監聽 0.0.0.0:8080 連接埠
$ws = new swoole_websocket_server("0.0.0.0", 8080); // 0.0.0.0 等於 localhost

// 監聽 WebSocket 連接打開事件
$ws->on('open', function ($ws, $request) {
	echo "進入者編號:{$request->fd}\n";
});

// 監聽 WebSocket 訊息事件
$ws->on('message', function ($ws, $frame) {

	echo "收到進入者 {$frame->fd} 訊息: {$frame->data} \n";

 	\Jsnlib\Swoole::push_all([
		'ws'           => $ws,
		'self'         => $frame->fd,
		'is_send_self' => false,
		'data'         => $frame->data
 	]);

});

// 今天 WebSocket 連接關閉事件
$ws->on('close', function ($ws, $fd) {
	echo "離開者編號:{$fd}\n";
});

$ws->start();

 

client.html

<input type="text" class="name" placeholder="請輸入姓名" autofocus>
<input type="submit" value="發送" onclick="send_msg(); ">
var wsServer = 'ws://chat.websocket.dennings.org:8080';
var websocket = new WebSocket(wsServer);

websocket.onopen = function (evt) {
	console.log("成功連接到 WebSocket 服務");
};

websocket.onclose = function (evt) {
	console.log("關閉連接 WebSocket 服務");
};

websocket.onmessage = function (evt) {
	console.log('伺服器顯示:' + evt.data);
};

websocket.onerror = function (evt, e) {
	console.log('發生錯誤: ' + evt.data);
};


// 發送訊息給所有人
const send_msg = function (){
	var name = document.getElementsByClassName('name')[0].value;
	var msg = JSON.stringify({
		message: '你好,我是' + name,
	})
	websocket.send(msg)
}

 

Comments

發表迴響