簡體   English   中英

使用網絡工作者進行大廳更新(可能還有聊天)?

[英]Usage of web-worker for lobby updating (and maybe chat)?

我創建了一個棋盤游戲的 web 版本,並制作了某種人們可以加入的大廳。 一旦玩家加入大廳,網絡工作者 ( https://www.w3schools.com/html/html5_webworkers.asp ) 將啟動並檢查大廳內的當前玩家以顯示它們。

調用部分:

<script>
    var w;

    function startWorker() {
        if (typeof(Worker) !== "undefined") {
            if (typeof(w) == "undefined") {
                //w = new Worker("demo_workers.js");
                w = new Worker("js/lobbyUpdater.js");
                w.postMessage(localStorage.groupID);
            }
            w.onmessage = function(event) {
                var response = JSON.parse(event.data);
                var player = response.player;
                var playerarry = player.split(":");
                document.getElementById("playerlist").innerHTML = "";
                var i = 0;
                for (i; i < response.playerCount; i++) {
                    var singleplayer = playerarry[i].split(",");
                    if (singleplayer[1] == localStorage.playerNumber) {
                        document.getElementById("playerlist").innerHTML += '<li><b>' + playerarry[i] + '</b></li>';
                    } else {
                        document.getElementById("playerlist").innerHTML += '<li>' + playerarry[i] + '</li>';
                    }
                }
                document.getElementById("currentPlayerAmount").innerHTML = response.playerCount;

                if (response.closed == 1) {
                    window.location.href = "playerpage.html";
                }

                console.log(event.data);
            };
        } else {
            document.getElementById("result").innerHTML = "Sorry, your browser does not support Web Workers...";
        }
    }

    function stopWorker() {
        w.terminate();
        w = undefined;
    }

    startWorker();

</script>

網絡工作者:

function updateLobby(groupID) {


    var Http = new XMLHttpRequest();
    var url = '../php/checkLobby.php';

    var preGroupID = '?groupID=';


    url = url.concat(preGroupID, groupID);

    Http.open("GET", url);
    Http.send();

    Http.onreadystatechange = (e) => {
        //console.log(Http.responseText)
        postMessage(Http.responseText);
    }

    var string = "updateLobby('";

    string = string.concat(groupID, "')");

    setTimeout(string, 1500);
}


onmessage = function (e) {
    var groupID = '';
    groupID = e.data;
    updateLobby(groupID);
};

weborker 每 1.5 秒運行一次,但我認為這會很頻繁(每一輪都會在后端創建一個查詢)。

現在我想創建一個聊天室,讓玩家可以互相交談。 為了接收消息,我想啟動另一個網絡工作者來檢查消息。

網絡工作者的使用通常可以嗎,或者我是否為此目的使用了“不需要的”技術。 有沒有更好的解決方案?

在后端使用如此頻繁的 sql 查詢會導致極端的性能峰值嗎? 當談到“我的 2c/4GB 數據庫服務器可以處理多少個查詢”時,我沒有經驗。

提前致謝!

在我看來,最好的解決方案是使用 WebSocket API。 它允許您與服務器連接,然后服務器能夠向客戶端發送請求。 因此客戶端不會通過檢查請求向服務器發送垃圾郵件,並且在發生更改時他總是會獲得最新信息。

瀏覽器的 WebSocket API 支持除 Opera Mini 之外的每個現代瀏覽器: https://caniuse.com/#feat=websockets

集成客戶端非常簡單。 關於服務器端 - 我沒有嘗試使用 PHP 創建 WebSocket 連接,所以我不能說太多。

替代解決方案,可能是 Firebase 實時數據庫。 在那里您可以閱讀有關它的教程: https://css-tricks.com/building-a-real-time-chat-app-with-react-and-firebase/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM