亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

搭建WebSocket簡(jiǎn)易聊天室

Lowky / 3205人閱讀

摘要:本文,我們通過(guò)和實(shí)現(xiàn)一個(gè)在線(xiàn)聊天室的。創(chuàng)建三個(gè)對(duì)象,一個(gè)作為多人在線(xiàn)聊天室,一個(gè)作為提示當(dāng)前在線(xiàn)人數(shù),還有一個(gè)為的作為在線(xiàn)人數(shù)顯示文本。創(chuàng)建一個(gè)對(duì)象為作為消息發(fā)送輸入框,用戶(hù)可以在此輸入消息進(jìn)行發(fā)送。

本文,我們通過(guò)Egret和Node.js實(shí)現(xiàn)一個(gè)在線(xiàn)聊天室的demo。主要包括:聊天,改用戶(hù)名,查看其他用戶(hù)在線(xiàn)狀態(tài)的功能。大致流程為,用戶(hù)訪(fǎng)問(wèn)網(wǎng)頁(yè),即進(jìn)入聊天狀態(tài),成為新游客,通過(guò)底部的輸入框,可以輸入自己想說(shuō)的話(huà),點(diǎn)擊發(fā)布,信息呈現(xiàn)給所有在聊天的人的頁(yè)面。用戶(hù)可以實(shí)時(shí)修改自己的昵稱(chēng),用戶(hù)離線(xiàn)上線(xiàn)都會(huì)實(shí)時(shí)廣播給其他用戶(hù)。

體驗(yàn)鏈接 http://7hds.com:8888/

下圖為最終制作完成的聊天面板

WebSocket服務(wù)器可以用其他語(yǔ)言編寫(xiě),本文采用的方法建立在Node.js上 。

在Node.js中我們使用ws第三方模塊來(lái)實(shí)現(xiàn)服務(wù)器業(yè)務(wù)邏輯的快速搭建,還需使用uuid模塊生成隨機(jī)id,你需要使用npm包管理器來(lái)安裝ws、uuid模塊。使用以下命令:

npm install ws -g
npm install uuid -g

安裝完成之后,使用終端工具進(jìn)入服務(wù)器目錄,開(kāi)始編寫(xiě)代碼:

//引入ws模塊
var WebSocket = require("ws");
//創(chuàng)建websocket服務(wù),端口port為:****
var WebSocketServer = WebSocket.Server,
    wss = new WebSocketServer({port: 8180});
//引入uuid模塊
var uuid = require("node-uuid");
//定義一個(gè)空數(shù)組,存放客戶(hù)端的信息 
var clients = [];
//定義發(fā)送消息方法wsSend
//參數(shù)為 type:類(lèi)型
//client_uuid:隨機(jī)生成的客戶(hù)端id
//nickname:昵稱(chēng)
//message:消息
//clientcount:客戶(hù)端個(gè)數(shù)
function wsSend(type, client_uuid, nickname, message,clientcount) {
    //遍歷客戶(hù)端
  for(var i=0; i= 2) {
        var old_nickname = nickname;
        nickname = nickname_array[1];
        var nickname_message = "用戶(hù) " + old_nickname + " 改名為: " + nickname;
        wsSend("nick_update", client_uuid, nickname, nickname_message,clients.length);
      }
    }//發(fā)送消息 
    else {
      wsSend("message", client_uuid, nickname, message,clients.length);
    }
  });
 //關(guān)閉socket連接時(shí)
  var closeSocket = function(customMessage) {
      //遍歷客戶(hù)端
    for(var i=0; i

服務(wù)器端主要是接收信息,判斷是聊天信息還是重命名信息,然后發(fā)送廣播。同時(shí),當(dāng)用戶(hù)連接上服務(wù)器端或者關(guān)閉連接時(shí),服務(wù)器也會(huì)發(fā)送廣播通知其他用戶(hù)。

我們封裝了wsSend函數(shù)用來(lái)處理消息的廣播。對(duì)每個(gè)連接的用戶(hù),我們默認(rèn)給他分配為游客。為了實(shí)現(xiàn)廣播,我們用clients數(shù)組來(lái)保存連接的用戶(hù)。

將編寫(xiě)好的文件保存為server.js,在終端工具中,使用node server.js來(lái)啟動(dòng)你剛剛編寫(xiě)的服務(wù)器。如果終端沒(méi)有報(bào)錯(cuò),證明你的代碼已經(jīng)正常運(yùn)行。

在實(shí)際項(xiàng)目中,服務(wù)器邏輯遠(yuǎn)遠(yuǎn)比此示例復(fù)雜得多。服務(wù)器端完成后,再來(lái)編寫(xiě)客戶(hù)端代碼。

界面非常簡(jiǎn)單,我們通過(guò)兩張圖片來(lái)實(shí)現(xiàn)界面效果,首先創(chuàng)建我們的聊天界面,此項(xiàng)目中為了方便我們使用EUI進(jìn)行快速開(kāi)發(fā)。如下圖:

首先創(chuàng)建一個(gè)Image來(lái)放置我們的背景圖。

創(chuàng)建三個(gè)Label對(duì)象,一個(gè)作為title:“多人在線(xiàn)聊天室”,一個(gè)作為提示:“當(dāng)前在線(xiàn)人數(shù)”,還有一個(gè)id為lb_online的作為在線(xiàn)人數(shù)顯示文本。

創(chuàng)建一個(gè)EditableText對(duì)象id為input_msg作為消息發(fā)送輸入框,用戶(hù)可以在此輸入消息進(jìn)行發(fā)送。

創(chuàng)建一個(gè)Button對(duì)象id為btn_ok,點(diǎn)擊按鈕可以執(zhí)行發(fā)送消息動(dòng)作。

創(chuàng)建界面的操作和WebSocket對(duì)象創(chuàng)建動(dòng)作在同時(shí)進(jìn)行,在init方法中創(chuàng)建WebSocket對(duì)象,并執(zhí)行服務(wù)器連接操作,代碼如下:

public ws;
    private init() {
        /**WebSocket連接 */
        this.ws = new WebSocket("ws://127.0.01:8180");
        this.ws.onopen = function (e) {
            console.log("Connection to server opened");
        }
    }

由于服務(wù)器開(kāi)放了8180端口,我們也需要使用8180端口進(jìn)行連接。當(dāng)連接成功,可執(zhí)行onopen方法。

服務(wù)器連接成功了,在控制臺(tái)打印 "Connection to server opened"。

onmessage方法中讀取服務(wù)器傳遞過(guò)來(lái)的數(shù)據(jù),并通過(guò)appendLog方法將數(shù)據(jù)顯示在對(duì)應(yīng)的文本里,

使用newLabel方法并將一條新消息插入到消息框中。

private init() {
        /**WebSocket連接 */
        this.ws = new WebSocket("ws://127.0.01:8180");
        this.ws.onopen = function (e) {
            console.log("Connection to server opened");
        }
        /**昵稱(chēng) */
        var nickname;
        var self = this;
        this.ws.onmessage = function (e) {
            var data = JSON.parse(e.data);
            nickname = data.nickname;
            appendLog(data.type, data.nickname, data.message, data.clientcount);
            console.log("ID: [%s] = %s", data.id, data.message);
            //插入消息
            self.group_msg.addChild(self.newLabel(data.nickname, data.message))
        }
        function appendLog(type, nickname, message, clientcount) {
            console.log(clientcount)
            /**聊天信息 */
            var messages = this.list_msg;
            /**提示 */
            var preface_label;
            if (type === "notification") {
                preface_label = "提示:";
            } else if (type === "nick_update") {
                preface_label = "警告:";
            } else {
                preface_label = nickname;
            }
            self.preface_label = preface_label;
            var message_text = self.message_text = message;
            /**在線(xiàn)人數(shù) */
            self.lb_online.text = clientcount;
        }
        /**點(diǎn)擊OK發(fā)送 */
        this.btn_ok.addEventListener(egret.TouchEvent.TOUCH_TAP, this.sendMessage, this);
    }
    private newLabel(name: string, msg: string) {
          var label1: eui.Label = new eui.Label();
          label1.text = name + ":" + msg;
          label1.textColor = 0x000000
          return label1;
    }

最后我們來(lái)編寫(xiě)發(fā)送消息的函數(shù),在btn_ok中egret.TouchEvent.TOUCH_TAP點(diǎn)擊之后的相應(yīng)函數(shù)為sendMessage方法。

/**發(fā)送消息 */
    private sendMessage() {
        var message = this.input_msg.text;
        if (message.length < 1) {
            // console.log("不能發(fā)送空內(nèi)容!");
            return;
        }
        this.ws.send(message);
        /**清空輸入框內(nèi)容 */
        this.input_msg.text = "";
    }

如果輸入框中內(nèi)容不為空的話(huà)就將數(shù)據(jù)通過(guò) this.ws.send(message); 發(fā)送給服務(wù)器,并清除輸入框的內(nèi)容。

最終運(yùn)行后,我們就可以實(shí)現(xiàn)多人在線(xiàn)聊天功能了。

完整版代碼如下:

class Chat extends eui.Component implements eui.UIComponent {
    /**在線(xiàn)人數(shù)文本 */
    public lb_online: eui.Label;
    /**聊天窗口 */
    public scr_msg: eui.Scroller;
    /**聊天信息 */
    public list_msg: eui.List;
    /**輸入框 */
    public input_msg: eui.EditableText;
    /**確定按鈕 */
    public btn_ok: eui.Button;
    /**聊天窗口消息組 */
    public group_msg: eui.Group;

    public constructor() {
        super();
    }
    protected partAdded(partName: string, instance: any): void {
        super.partAdded(partName, instance);
    }
    protected childrenCreated(): void {
        this.init();
        super.childrenCreated();
    }
    /**WebSocket */
    public ws;
    public preface_label;
    public message_text;
    private init() {
        /**WebSocket連接 */
         //線(xiàn)上測(cè)試鏈接,服務(wù)端代碼需在服務(wù)器啟動(dòng)
        //this.ws = new WebSocket("ws://7hds.com:8180");
        this.ws = new WebSocket("ws://127.0.01:8180");
        this.ws.onopen = function (e) {
            console.log("Connection to server opened");
        }
        /**昵稱(chēng) */
        var nickname;
        var self = this;
        this.ws.onmessage = function (e) {
            var data = JSON.parse(e.data);
            nickname = data.nickname;
            appendLog(data.type, data.nickname, data.message, data.clientcount);
            console.log("ID: [%s] = %s", data.id, data.message);
            //插入消息
            self.group_msg.addChild(self.newLabel(data.nickname, data.message))
        }
        function appendLog(type, nickname, message, clientcount) {
            console.log(clientcount)
            /**聊天信息 */
            var messages = this.list_msg;
            /**提示 */
            var preface_label;
            if (type === "notification") {
                preface_label = "提示:";
            } else if (type === "nick_update") {
                preface_label = "警告:";
            } else {
                preface_label = nickname;
            }
            self.preface_label = preface_label;
            var message_text = self.message_text = message;
            /**在線(xiàn)人數(shù) */
            self.lb_online.text = clientcount;
        }
        /**點(diǎn)擊OK發(fā)送 */
        this.btn_ok.addEventListener(egret.TouchEvent.TOUCH_TAP, this.sendMessage, this);
    }
    /**發(fā)送消息 */
    private sendMessage() {
        var message = this.input_msg.text;
        if (message.length < 1) {
            // console.log("不能發(fā)送空內(nèi)容!");
            return;
        }
        this.ws.send(message);
        /**清空輸入框內(nèi)容 */
        this.input_msg.text = "";
        // console.log(this.ws.bufferedAmount);
    }
    private newLabel(name: string, msg: string) {
        var label1: eui.Label = new eui.Label();
        label1.text = name + ":" + msg;
        label1.textColor = 0x000000
        return label1;
    }

}

本文的demo增加了客戶(hù)端與服務(wù)器的互動(dòng),同時(shí)也實(shí)現(xiàn)了客戶(hù)端之間的聯(lián)系。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/97622.html

相關(guān)文章

  • 利用express+socket.io實(shí)現(xiàn)一個(gè)簡(jiǎn)易天室

    摘要:用偽代碼來(lái)模擬下長(zhǎng)輪詢(xún)的過(guò)程前端利用下面函數(shù)進(jìn)行請(qǐng)求后端代碼做如下更改利用隨機(jī)數(shù)的大小來(lái)模擬是否有新數(shù)據(jù)有新數(shù)據(jù)來(lái)了長(zhǎng)輪詢(xún)的確減少了請(qǐng)求的次數(shù),但是它也有著很大的問(wèn)題,那就是耗費(fèi)服務(wù)器的資源。 寫(xiě)在前面 最近由于利用node重構(gòu)某個(gè)項(xiàng)目,項(xiàng)目中有一個(gè)實(shí)時(shí)聊天的功能,于是就研究了一下聊天室,在線(xiàn)demo|源碼,歡迎大家反饋。這個(gè)聊天室的主要利用到了socket.io和express。這個(gè)...

    Chaz 評(píng)論0 收藏0
  • Node.js+WebSocket創(chuàng)建簡(jiǎn)單天室

    摘要:好的,這樣以來(lái)我們的前期準(zhǔn)備工作就已經(jīng)完成了,下面我們來(lái)搭建聊天室對(duì)應(yīng)的客戶(hù)端和服務(wù)器端。 websocket簡(jiǎn)介 websocket其實(shí)HTML中新增加的內(nèi)容,其本質(zhì)還是一種網(wǎng)絡(luò)通信協(xié)議,以下是websocket的一些特點(diǎn): (1)因?yàn)檫B接在端口80(ws)或者443(wss)上創(chuàng)建,與HTTP使用的端口相同,幾乎所有的防火墻都不會(huì)阻塞WebSocket鏈接 (2)因...

    cppprimer 評(píng)論0 收藏0
  • Node.js+WebSocket創(chuàng)建簡(jiǎn)單天室

    摘要:好的,這樣以來(lái)我們的前期準(zhǔn)備工作就已經(jīng)完成了,下面我們來(lái)搭建聊天室對(duì)應(yīng)的客戶(hù)端和服務(wù)器端。 websocket簡(jiǎn)介 websocket其實(shí)HTML中新增加的內(nèi)容,其本質(zhì)還是一種網(wǎng)絡(luò)通信協(xié)議,以下是websocket的一些特點(diǎn): (1)因?yàn)檫B接在端口80(ws)或者443(wss)上創(chuàng)建,與HTTP使用的端口相同,幾乎所有的防火墻都不會(huì)阻塞WebSocket鏈接 (2)因...

    Seay 評(píng)論0 收藏0
  • websocket搭建簡(jiǎn)單的網(wǎng)頁(yè)天室框架【續(xù)1】

    摘要:聊天室的鏈接已經(jīng)失效因?yàn)槲也渴鹆艘粋€(gè)新的網(wǎng)站,歡迎大家訪(fǎng)問(wèn)在搭建簡(jiǎn)單的網(wǎng)頁(yè)聊天室框架這篇文章中,我們簡(jiǎn)單實(shí)現(xiàn)了一個(gè)聊天室,我又花了一些時(shí)間寫(xiě)了個(gè)稍微復(fù)雜一點(diǎn)點(diǎn)的,大家可以通過(guò)進(jìn)入聊天室或訪(fǎng)問(wèn)。 聊天室的鏈接已經(jīng)失效!因?yàn)槲也渴鹆艘粋€(gè)新的網(wǎng)站,歡迎大家訪(fǎng)問(wèn)mytodo.vip 在websocket搭建簡(jiǎn)單的網(wǎng)頁(yè)聊天室框架這篇文章中,我們簡(jiǎn)單實(shí)現(xiàn)了一個(gè)websocket聊天室,我又花了一...

    liaoyg8023 評(píng)論0 收藏0
  • websocket搭建簡(jiǎn)單的網(wǎng)頁(yè)天室框架

    摘要:我們要做一個(gè)網(wǎng)頁(yè)版的聊天室,當(dāng)一個(gè)人發(fā)送了消息時(shí),其他人怎么能看到這條信息呢有一個(gè)做法就是在網(wǎng)頁(yè)中不斷的運(yùn)行,發(fā)送給服務(wù)器,服務(wù)器不斷返回,當(dāng)有新的消息時(shí)顯示在頁(yè)面上。這樣做毫無(wú)疑問(wèn)會(huì)產(chǎn)生大量的連接,對(duì)服務(wù)器的性能和帶寬都有影響。 http協(xié)議,是客戶(hù)端每發(fā)送一個(gè)request,服務(wù)器返回一個(gè)response,無(wú)法做到服務(wù)器主動(dòng)向客戶(hù)端發(fā)送數(shù)據(jù)。我們要做一個(gè)網(wǎng)頁(yè)版的聊天室,當(dāng)一個(gè)人發(fā)送...

    UsherChen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<