workerman下載地址 http://www.workerman.net/
html
<!DOCTYPE html>
<html>
<head>
<title>HTML5</title>
<meta charset="utf-8" />
<script src="/public/admin/js/jquery.min.js"></script>
<script>
$(function() {
var socket;
var readyState = ["connecting", "connected", "closing", "closed"];
/* 打開連接事件 */
$("button:eq(0)").click(function() {
try {
/* 連接 */
socket = new WebSocket("ws://192.168.56.1:2345");
/* 綁定事件 */
socket.onopen = function() {
$("#msg").html("連接成功...");
};
socket.onmessage = function(e) {
$("#msg").html($("#msg").html() + "<br />" + e.data);
};
socket.onclose = function() {
$("#msg").html($("#msg").html() + "<br />關閉連接...");
};
} catch(exception) {
$("#msg").html($("#msg").html() + "<br />有錯誤發生");
}
});
/* 發送數據事件 */
$("button:eq(1)").click(function() {
/* 檢查文本框是否為空 */
if($("#data").val() == "") {
alert("請輸入數據!");
return;
}
try {
socket.send($("#data").val());
$("#msg").html($("#msg").html() + "<br />發送數據:" + $("#data").val());
} catch (exception) {
$("#msg").html($("#msg").html() + "<br />發送數據出錯");
}
/* 清空文本框 */
$("#data").val("");
});
/* 斷開連接 */
$("button:eq(2)").click(function() {
socket.close();
});
});
</script>
</head>
<body>
<h1>WebSocket示例</h1>
<input type="text" id="data" />
<button>打開連接</button>
<button>發送數據</button>
<button>關閉連接</button>
<p id="msg"></p>
</body>
</html>
php
<?php
use Workerman\Worker;
require_once '../Workerman/Autoloader.php';
// 創建一個Worker監聽2345端口,使用http協議通訊
$ws_worker = new Worker("websocket://0.0.0.0:2345");
//啟動4個進程對外提供服務
$ws_worker->count = 4;
$ws_worker->onWorkerStart = function($worker)
{
echo "Worker starting...\n";
};
//當接收到客戶端發來的數據后顯示數據並回發到客戶端
$ws_worker->onMessage = function($connection, $data) {
global $ws_worker;
//顯示數據
echo "you just received: $data\n";
//向客戶端回發數據
if(!isset($connection->uid))
{
// 沒驗證的話把第一個包當做uid(這里為了方便演示,沒做真正的驗證)
$connection->uid = $data;
/* 保存uid到connection的映射,這樣可以方便的通過uid查找connection,
* 實現針對特定uid推送數據
*/
$ws_worker->uidConnections[$connection->uid] = $connection;
return $connection->send('login success, your uid is ' . $connection->uid);
}
// uid 為 all 時是全局廣播
list($recv_uid, $message) = explode(':', $data);
// 全局廣播
if($recv_uid == 'all')
{
broadcast($message);
}
// 給特定uid發送
else
{
sendMessageByUid($recv_uid, $message);
}
};
// 向所有驗證的用戶推送數據
function broadcast($message)
{
global $ws_worker;
foreach($ws_worker->uidConnections as $connection)
{
echo '1/';
$connection->send($message);
}
}
// 針對uid推送數據
function sendMessageByUid($uid, $message)
{
global $ws_worker;
if(isset($ws_worker->uidConnections[$uid]))
{
$connection = $ws_worker->uidConnections[$uid];
$connection->send($message);
}
}
// 運行worker
Worker::runAll();
?>
可以單獨給某個用戶發信息,又可以給全部人發信息
