一起來學習用nodejs和CocosCreator開發網絡游戲吧(二)--- websocket


  一般的網絡游戲都是使用socket作為網絡通信手段,關於socket相關的知識,也有很多博客和文章有過說明,可以去搜索學習,這里就不另外說明了。

  這篇博客的目的,僅僅是為了記錄如何去使用相關的工具,而不是其原理,畢竟有更多的大神比我說得清楚。記錄下來,是為了在以后再次使用中,亦或者讓閱讀到這篇博客的小伙伴,能看到最簡單最暴力的使用方法。

  閑話不多說了,來,開始吧。

 

  在nodejs服務器中,將使用nodejs-websocket這個組件來實現websocket連接。

  用終端進入到nodejs服務端代碼根目錄下,用npm安裝nodejs-websocket。

npm install nodejs-websocket

  

  在nodejs項目根目錄下新建一個websocketServer.js,用來添加相關服務端代碼。

  

const ws = require("nodejs-websocket");

module.exports = createServer = () => {

let server = ws.createServer(connection => {
    //客戶端向服務器發送字符串時的監聽函數
    connection.on("text", result => {
      console.log("connection.on -> text", result);
    });
    //客戶端向服務器發送二進制時的監聽函數
    connection.on("binary", result => {
      console.log("connection.on -> binary", result);
    });
    //客戶端連接到服務器時的監聽函數
    connection.on("connect", result => {
      console.log("connection.on -> connect", result);
    });
    //客戶端斷開與服務器連接時的監聽函數
    connection.on("close", result => {
      console.log("connection.on -> close", result);
    });
    //客戶端與服務器連接異常時的監聽函數
    connection.on("error", result => {
      console.log("connection.on -> error", result);
    });
  }).listen(8182);
;

  return server;
};

 

  這是一個簡單的websocket模塊。接下來修改nodejs根目錄下index.js的相關代碼:

  

const http = require('http');
const url = require('url');
const wsServer = require('./websocketServer');

http.createServer(function(req, res){
    var request = url.parse(req.url, true).query
    var response = {
        info: request.input ? request.input + ', hello world' : 'hello world'
    };
    res.setHeader("Access-Control-Allow-Origin", "*");//跨域
    res.write(JSON.stringify(response));
    res.end();
}).listen(8181);

wsServer();

 

這樣我們就創建好了一個簡單的websocket連接。

接下來修改客戶端代碼,創建一下客戶端的websocket連接。並在ui中新添加一個Label用來顯示websocket服務器返回的信息,添加一個button用來給websocket發送消息。

    properties: {
        subButtonHttp: {
            default: null,
            type: cc.Button
        },
        subButtonWS: {
            default: null,
            type: cc.Button
        },
        tipLabel: {
            default: null,
            type: cc.Label
        },
        tipLabelWS: {
            default: null,
            type: cc.Label
        },
        input: {
            default: null,
            type: cc.EditBox
        }
    },

 

接下來修改一下onLoad方法,在里面添加websocket的初始化代碼:

    onLoad() {
        this.ws = new WebSocket('ws://127.0.0.1:8182');
        //開啟websocket
        this.ws.onopen = (event) => {
            console.log("event========");
            console.log(event);
            console.log("event========");
        }

        let that = this;
        //接受websocket的數據
        this.ws.onmessage = (event) => {
            console.log("onmessage========");
            console.log(event);
            console.log("onmessage========");
            that.tipLabelWS.string = event.data;
        }
    },

 

再添加一個按鈕方法綁定到subButtonWS按鈕上,上傳的信息依然是輸入框中的信息:

    wsRequest() {
        if(this.ws.readyState === WebSocket.OPEN) {
            this.ws.send(this.input.string);
        }
    },

 

當客戶端點擊按鈕發送消息給服務器時,服務器需要處理接收到的數據並分發給所有連接到websocket的客戶端。

修改服務器端websocketServer.js中的代碼:

const ws = require("nodejs-websocket");

module.exports = createServer = () => {
  let server = ws.createServer(connection => {
    //客戶端向服務器發送字符串時的監聽函數
    connection.on("text", result => {
      console.log("connection.on -> text", result);
      //在這里,接收到某一個客戶端發來的消息,然后統一發送給所有連接到websocket的客戶端
      server.connections.forEach((client) => {
          client.sendText(result);
      });
    });
    //客戶端向服務器發送二進制時的監聽函數
    connection.on("binary", result => {
      console.log("connection.on -> binary", result);
    });
    //客戶端連接到服務器時的監聽函數
    connection.on("connect", result => {
      console.log("connection.on -> connect", result);
    });
    //客戶端斷開與服務器連接時的監聽函數
    connection.on("close", result => {
      console.log("connection.on -> close", result);
    });
    //客戶端與服務器連接異常時的監聽函數
    connection.on("error", result => {
      console.log("connection.on -> error", result);
    });
  }).listen(8182);

  return server;
};

 

重新啟動服務端和客戶端。當在輸入框輸入信息並點擊后,可以看到消息改變:

 

 

 

 

 

可以再開啟一個相同的調試頁面:

 

 

 

此時新打開的頁面處於初始化狀態:

 

 

在第二個頁面中輸入一些信息,並點擊提交WS按鈕:

 

 

 

 

可以看到第二個頁面的相關信息已經改變,此時再切換到第一個頁面:

 

 

 

可以看到,輸入框中的字還是上一次輸入的內容,但是因為websocket向所有客戶端發送了消息,label顯示的內容已經發生了改變。

 

經過上述步驟,就簡單的實現了多個客戶端之間產生的交互了。

下一次,我將繼續擴展上述的功能,實現一個多客戶端的聊天窗。

 

  文章中的代碼:

  客戶端: https://github.com/MythosMa/CocosCreator_ClientTest.git

  服務端: https://github.com/MythosMa/NodeJS_GameServerTest.git


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM