成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

socket.io實(shí)現(xiàn)在線聊天頁(yè)面

Gemini / 2043人閱讀

一.要點(diǎn)分析

(1) 對(duì)于socket.io,它是基于事件響應(yīng)的socket,可以進(jìn)行長(zhǎng)時(shí)間的消息傳遞。其服務(wù)端使用的方法主要不過(guò)就是兩個(gè),on()和emit()

io.on("connetcion",function(socket) {
    socket.on("event",function(data) {
        /*執(zhí)行相應(yīng)的方法*/
        //通知客戶端執(zhí)行事件
        socket.emit("new event",{data:"mydata"});
    });
});

(2)搭建好服務(wù)器端后就進(jìn)行客戶端連接

//引入socket
var socket = io();

socket.on("event",function(data) {
    /*執(zhí)行事件*/    
    //通知服務(wù)器端執(zhí)行事件
    socket.emit("new event",{data:"mydata"});
});

(3)接下來(lái)就是對(duì)視圖的搭建

二.源代碼和注釋分析

(1) app.js:

//引入express框架
var express = require("express");
var app = express();

//服務(wù)端創(chuàng)建
var server = require("http").createServer(app);
//使用socket.io進(jìn)行通信
var io = require("socket.io")(server);
var port = process.env.POST || 8000;

//服務(wù)開(kāi)啟
server.listen(port,function() {
    console.log("The chatting room is running at port: " + port);
});

//使用靜態(tài)文件目錄
app.use(express.static(__dirname + "/public"));

//當(dāng)前進(jìn)入聊天室的人數(shù)
var usersNumber = 0;

//客戶端通過(guò)socket鏈接服務(wù)端
io.on("connection",function(socket) {
    //默認(rèn)沒(méi)有用戶進(jìn)入
    var addUser = false;
    
    //客戶端發(fā)送新的消息
    socket.on("new message",function(data) {
        //廣播所有在線客戶端新消息的產(chǎn)生
        socket.broadcast.emit("new message",{
            userName: socket.userName,
            message: data
        });
    });
    //客戶端發(fā)送有用戶加入的消息
    socket.on("add user",function(userName) {
        if(addUser) return;
        socket.userName = userName;
        usersNumber++;
        addUser=true;
        //向客戶端發(fā)送登陸成功
        socket.emit("login",{
            userName: socket.userName,
            usersNumber:usersNumber
        });
        //廣播有新用戶加入
        socket.broadcast.emit("new user join",{
            userName:socket.userName,
            usersNumber:usersNumber
        });
    });
    //客戶端斷開(kāi)鏈接
    socket.on("disconnect",function() {
        if(addUser) {
            usersNumber--;
            //通知所有客戶端有用戶離開(kāi)
            socket.broadcast.emit("user left",{
                userName:socket.userName,
                usersNumber:usersNumber
            });
        }
    });
});

(2) main.js:

$(function(){
    //創(chuàng)建socket與服務(wù)端鏈接
    var socket = io();
    //通過(guò)jquery獲取dom節(jié)點(diǎn)
    var $logPage = $(".logPage");
    var $logList = $(".logList");
    var $chatPage = $(".chatPage");
    var $messageContent = $(".messageContent");
    var $messageList = $(".messageList");
    var $messageInput = $(".messageInput");
    var $usernameInput = $(".usernameInput");
    var $sendMessage = $(".sendMessage");
    var $addUser = $(".addUser");
    var $loginPage = $(".loginPage");
    var $messageInputBar = $(".messageInputBar");

    //默認(rèn)當(dāng)前登陸輸入框?yàn)榻裹c(diǎn)狀態(tài)
    var $currentInput = $usernameInput.focus();

    //用于記錄當(dāng)前的用戶名
    var userName;
    var connect = false;

    //監(jiān)聽(tīng)服務(wù)器是否有新的消息產(chǎn)生,有的話就顯示消息到列表
    socket.on("new message",function(data) {
        //在列表框中添加消息,類(lèi)型為收取的消息
        addNewMessage(data,2);
    });

    //監(jiān)聽(tīng)服務(wù)器是否登陸成功,成功就顯示成功登陸
    socket.on("login",function(data) {
        userLogin(data);
    });

    //監(jiān)聽(tīng)服務(wù)器是否有新的用戶加入,有的話就顯示
    socket.on("new user join",function(data) {
        newUserJoin(data);
    });

    //監(jiān)聽(tīng)服務(wù)器是否有用戶離開(kāi)
    socket.on("user left",function(data){
        userLeft(data);
    });


    function userLogin(data) {
        //登陸成功,輸出信息
        connect = true;
        $logList.empty();
        $logList.append("
  • Name: " + data.userName + " is joined

  • "); $logList.append("
  • CurrentNumber: " + data.usersNumber + "

  • "); } function addNewMessage(data,state) { if(state == 1) { $messageList.append( "
    " + data.userName +"
    "+data.message+"
    "); }else { $messageList.append( "
    " + data.userName +"
    "+data.message+"
    "); } } function newUserJoin(data) { $logList.empty(); $logList.append("
  • Name: " + data.userName + " is joined

  • "); $logList.append("
  • CurrentNumber: " + data.usersNumber + "

  • "); } function userLeft(data) { $logList.empty(); $logList.append("
  • User: " + data.userName + " has left

  • "); $logList.append("
  • CurrentNumber: " + data.usersNumber + "

  • "); } //當(dāng)用戶點(diǎn)擊發(fā)送消息時(shí)的事件 $sendMessage.click(function(event) { /* Act on the event */ var message = $messageInput.val(); if (message && connect) { $messageInput.val(""); addNewMessage({ userName: userName, message: message },1); socket.emit("new message", message); } }); //當(dāng)用戶點(diǎn)擊登陸事件 $addUser.click(function(event) { /* Act on the event */ userName = $usernameInput.val().trim(); if (userName) { $loginPage.fadeOut(); $chatPage.show(); $messageInputBar.show(); $loginPage.off("click"); $currentInput = $messageInput.focus(); socket.emit("add user", userName); } }); });

    (3) index.html:

    
    
        
        
        
        
        
        
        
        
            
    Chatting Room
      Please input your name
      Login
      Send

      (4) 使用aui視圖框架

      github倉(cāng)庫(kù)鏈接
      聊天室鏈接

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

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

      相關(guān)文章

      • 基于react+react-router+redux+socket.io+koa開(kāi)發(fā)一個(gè)聊天

        摘要:最近練手開(kāi)發(fā)了一個(gè)項(xiàng)目,是一個(gè)聊天室應(yīng)用。由于我們的項(xiàng)目是一個(gè)單頁(yè)面應(yīng)用,因此只需要統(tǒng)一打包出一個(gè)和一個(gè)。而就是基于實(shí)現(xiàn)的一套基于事件訂閱與發(fā)布的通信庫(kù)。比如說(shuō),某一個(gè)端口了,而如果端口訂閱了,那么在端,對(duì)應(yīng)的回調(diào)函數(shù)就會(huì)被執(zhí)行。 最近練手開(kāi)發(fā)了一個(gè)項(xiàng)目,是一個(gè)聊天室應(yīng)用。項(xiàng)目雖不大,但是使用到了react, react-router, redux, socket.io,后端開(kāi)發(fā)使用了...

        NusterCache 評(píng)論0 收藏0
      • vue+socket.io+express+mongodb 實(shí)現(xiàn)簡(jiǎn)易多房間在線群聊

        摘要:項(xiàng)目簡(jiǎn)介主要是通過(guò)做一個(gè)多人在線多房間群聊的小項(xiàng)目來(lái)練手全棧技術(shù)的結(jié)合運(yùn)用。編譯運(yùn)行開(kāi)啟服務(wù),新建命令行窗口啟動(dòng)服務(wù)端,新建命令行窗口啟動(dòng)前端頁(yè)面然后在瀏覽器多個(gè)窗口打開(kāi),注冊(cè)不同賬號(hào)并登錄即可進(jìn)行多用戶多房間在線聊天。 項(xiàng)目簡(jiǎn)介 主要是通過(guò)做一個(gè)多人在線多房間群聊的小項(xiàng)目、來(lái)練手全棧技術(shù)的結(jié)合運(yùn)用。 項(xiàng)目源碼:chat-vue-node 主要技術(shù): vue2全家桶 + socket....

        android_c 評(píng)論0 收藏0
      • 手把手教你擼一個(gè)網(wǎng)頁(yè)聊天

        摘要:前端邏輯搞定之后,思考一下這個(gè)聊天室的交互是怎么實(shí)現(xiàn)的。在前端監(jiān)聽(tīng)一個(gè)事件,這個(gè)事件的觸發(fā)條件是成功和服務(wù)端建立連接。攜帶一個(gè)參數(shù),即用戶的輸入。別人發(fā)送的消息現(xiàn)在就需要在前端建立一個(gè)響應(yīng)服務(wù)端有新消息的監(jiān)聽(tīng)事件了。 一些廢話:) 最近在學(xué)校比較閑,終于有這么一塊時(shí)間可以自由支配了,所以內(nèi)心還是十分的酸爽舒暢的。當(dāng)然了,罪惡的事情也是有的,比如已經(jīng)連續(xù)一周沒(méi)有吃早飯了,其實(shí)現(xiàn)在回頭想想...

        nemo 評(píng)論0 收藏0
      • 手把手教你擼一個(gè)網(wǎng)頁(yè)聊天

        摘要:前端邏輯搞定之后,思考一下這個(gè)聊天室的交互是怎么實(shí)現(xiàn)的。在前端監(jiān)聽(tīng)一個(gè)事件,這個(gè)事件的觸發(fā)條件是成功和服務(wù)端建立連接。攜帶一個(gè)參數(shù),即用戶的輸入。別人發(fā)送的消息現(xiàn)在就需要在前端建立一個(gè)響應(yīng)服務(wù)端有新消息的監(jiān)聽(tīng)事件了。 一些廢話:) 最近在學(xué)校比較閑,終于有這么一塊時(shí)間可以自由支配了,所以內(nèi)心還是十分的酸爽舒暢的。當(dāng)然了,罪惡的事情也是有的,比如已經(jīng)連續(xù)一周沒(méi)有吃早飯了,其實(shí)現(xiàn)在回頭想想...

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

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

      0條評(píng)論

      最新活動(dòng)
      閱讀需要支付1元查看
      <