国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

服務器端部署https,純workerman制作一對一聊天多人聊天(支持多端),服務器端消息通知等

haomc

https服務器端NGINX親測可用

1.安裝:

composer require workerman/workerman

2.服務器端代碼:(代碼文件:start.php ,測試運行:php start.php start,守護運行:php start.php start -d)

<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';

// 心跳間隔55秒
define('HEARTBEAT_TIME', 55);
$worker = new Worker('websocket://0.0.0.0:8484');
$worker->count = 1;
// $worker->transport = 'ssl'; // 強制使用 SSL 傳輸層
$worker->connectionList = [];
// 進程啟動后設置一個每10秒運行一次的定時器
$worker->onWorkerStart = function ($worker){
    Timer::add(10, function() use ($worker){
        $time_now = time();
        foreach($worker->connections as $connection) {
            // 有可能該connection還沒收到過消息,則lastMessageTime設置為當前時間
            if (empty($connection->lastMessageTime)) {
                $connection->lastMessageTime = $time_now;
                continue;
            }
            // 上次通訊時間間隔大于心跳間隔,則認為客戶端已經(jīng)下線,關閉連接
            if ($time_now - $connection->lastMessageTime > HEARTBEAT_TIME) {
                $connection->send('您長時間未請求服務器,鏈接已經(jīng)斷開');
                $connection->close();
            }
        }
    });

    // 開啟一個內(nèi)部端口,方便內(nèi)部系統(tǒng)推送數(shù)據(jù),Text協(xié)議格式 文本+換行符
    $textWorker = new Worker('tcp://0.0.0.0:5678');
    $textWorker->onMessage = function($connection, $data) use ($worker)
    {
        // $data數(shù)組格式,里面有uid,表示向那個uid的頁面推送數(shù)據(jù)
        $data = json_decode($data, true);
        //聊天
        if ($data['type'] == 'text')
        {
            if (isset($worker->connectionList[$data['userToId']]))
            {
                $conns = $worker->connectionList[$data['userToId']];
                foreach ($conns as $conn){
                    $conn->send(json_encode([
                        'status' => 1,
                        'message' => $data['message'],
                    ]));
                }
                $connection->send(json_encode([
                    'status' => 1,
                    'message' => '消息發(fā)送成功',
                ]));
            }else{
                $connection->send(json_encode([
                    'status' => 0,
                    'message' => '消息發(fā)送失敗,對方下線了哈',
                ]));
            }
        }
    };
    $textWorker->listen();

//            $output->writeln('用戶onWorkerStart'  );
};

$worker->onConnect = function(TcpConnection $connection) use ($worker)
{
    // 指令輸出
    // echo('用戶:'.$worker->id.'-'.$connection->id.'鏈接成功');
    echo($connection->id.'ok');
};

$worker->onMessage = function ($connection, $data) use ($worker) {
    // 給connection臨時設置一個lastMessageTime屬性,用來記錄上次收到消息的時間
    $connection->lastMessageTime = time();
    $data = json_decode($data, true);
    //綁定用戶ID
    if ($data['type'] == 'bind' && isset($data['userId']) && !isset($connection->userId))
    {
        $connection->userId = $data['userId'];
        $worker->connectionList[$connection->userId][$connection->id] = $connection;
    }

    //聊天
    if ($data['type'] == 'text')
    {
        if (isset($worker->connectionList[$data['userToId']]))
        {
            $conns = $worker->connectionList[$data['userToId']];
            foreach ($conns as $conn){
                $conn->send('用戶'.$data['userToId'].':'.$data['message']);
            }
        }else{
            $connection->send('我:對方下線了');
        }
    }

    //心跳接收并回應
    if ($data['type'] == 'ping')
    {
        $connection->send('peng');
    }
    //向客戶端自己發(fā)送數(shù)據(jù)
    if (!empty($data['message'])){
        $connection->send('我:'.$data['message']);
    }
//            // 指令輸出
//            $output->writeln('用戶:'.$connection->id.',客戶端接收到數(shù)據(jù):'.json_encode($data)  );

};
// 客戶端連接斷開時,斷開對應的鏈接連接
$worker->onClose = function(TcpConnection $connection) use ($worker)
{

    if(isset($connection->userId) && isset($worker->connectionList[$connection->userId]))
    {
        // 連接斷開時刪除映射
        if (count($worker->connectionList[$connection->userId]) == 1){
            unset($worker->connectionList[$connection->userId]);
        }else{
            unset($worker->connectionList[$connection->userId][$connection->id]);
        }
    }
    // 指令輸出
    // echo('用戶:'.$connection->id.'已經(jīng)斷開鏈接。'.$connection->userId);
};

// 運行worker
Worker::runAll();

3.客戶端測試代碼:(代碼文件:index.html,前臺:https://www.test.com/?userid=1000,https://www.test.com/?userid=2000

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>WebSocket Example</title>
</head>
<body>
    <p>用戶:<input type="text" id="userToId" value="1000"></p>
    <p>內(nèi)容:<input type="text" id="msg"></p>
    <p><button id="sendMessageButton">發(fā)送消息</button></p>

    <script>
        function getUrlParams() {
            const url = window.location.search
          const paramsRegex = /[?&]+([^=&]+)=([^&]*)/gi;
          const params = {};
          let match;
          while (match = paramsRegex.exec(url)) {
            params[match[1]] = match[2];
          }
          return params;
        }
        // 創(chuàng)建 WebSocket 連接
        const ws = new WebSocket('wss://hospital.s.cntmt.cn/websocket');
        let data = getUrlParams()
        // 連接打開時觸發(fā)
        ws.onopen = function() {
            console.log('已連接到服務器.',data.userid);
            ws.send(JSON.stringify({
                type: 'bind',
                userId: data.userid,
            }));
            // 間隔30秒通知一次服務器我還在線
            setInterval(() => {
                ws.send(JSON.stringify({
                    type: 'ping'
                }));
            },50000);
        };

        // 收到服務器消息時觸發(fā)
        ws.onmessage = function(event) {
            console.log(event.data);
            // 可以在這里添加更多的處理邏輯,比如更新頁面內(nèi)容
            // alert('Received from server: ' + event.data);
        };

        // 連接關閉時觸發(fā)
        ws.onclose = function() {
            console.log('已斷開與服務器的連接');
        };

        // 連接出錯時觸發(fā)
        ws.onerror = function(error) {
            console.error('WebSocket Error:', error);
        };

        // 獲取按鈕元素
        const sendMessageButton = document.getElementById('sendMessageButton');
        const msg = document.getElementById('msg');
        const userToId = document.getElementById('userToId');

        // 為按鈕添加點擊事件監(jiān)聽器
        sendMessageButton.addEventListener('click', function() {
            // 檢查 WebSocket 連接是否已打開
            if (ws.readyState === WebSocket.OPEN) {
                // 發(fā)送消息給服務器'發(fā)送:' + msg.value
                ws.send(JSON.stringify({
                    type: 'text',
                    userToId: userToId.value,
                    message: msg.value,
                }));
                // console.log('Message sent to server: Hello Server!');
            } else {
                console.error('WebSocket未打開。就緒狀態(tài):', ws.readyState);
            }
        });

    </script>
</body>
</html>

4.服務器后端通知前端測試代碼:(后臺發(fā)送消息文件:send.php,運行:https://www.abc.com/send.php)

<?php

// 建立socket連接到內(nèi)部推送端口
//134.175.18.35:5678這個是workerman服務器地址
        $client = stream_socket_client('tcp://134.175.18.35:5678', $errno, $errmsg, 1);
        // 推送的數(shù)據(jù),包含uid字段,表示是給這個uid推送
        $data = [
            'type' => 'text',
            'userToId' => '1000',
            'message' => [
                'title'=>'baiti',
                'content'=>'neirong',
                'time'=>date('Y-m-d H:i:s')
            ]
        ];
        // 發(fā)送數(shù)據(jù),注意5678端口是Text協(xié)議的端口,Text協(xié)議需要在數(shù)據(jù)末尾加上換行符
        fwrite($client, json_encode($data)."\n");
        // 讀取推送結(jié)果
        echo fread($client, 8192);

?>

5.服務器配置 nginx反向代理支持https

在www.test.com站點配置可以跨服務器,配置下面代理地址

# WebSocket根路徑代理
    # WebSocket根路徑代理
    location /websocket
    {
      proxy_pass http://134.175.18.35:8484;
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Real_IP $remote_addr;
      proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection upgrade;
      break; 
    }
763 1 2
1個評論

Tinywan

能不能把代碼整理一下,怎么這么亂

  • haomc 2025-02-26

    我從新改下,是編輯有問題昨天

haomc

320
積分
0
獲贊數(shù)
0
粉絲數(shù)
2025-02-18 加入
??