资讯专栏INFORMATION COLUMN

socket.io实现在线聊天页面

Gemini / 1935人阅读

一.要点分析

(1) 对于socket.io,它是基于事件响应的socket,可以进行长时间的消息传递。其服务端使用的方法主要不过就是两个,on()和emit()

io.on("connetcion",function(socket) {
    socket.on("event",function(data) {
        /*执行相应的方法*/
        //通知客户端执行事件
        socket.emit("new event",{data:"mydata"});
    });
});

(2)搭建好服务器端后就进行客户端连接

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

socket.on("event",function(data) {
    /*执行事件*/    
    //通知服务器端执行事件
    socket.emit("new event",{data:"mydata"});
});

(3)接下来就是对视图的搭建

二.源代码和注释分析

(1) app.js:

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

//服务端创建
var server = require("http").createServer(app);
//使用socket.io进行通信
var io = require("socket.io")(server);
var port = process.env.POST || 8000;

//服务开启
server.listen(port,function() {
    console.log("The chatting room is running at port: " + port);
});

//使用静态文件目录
app.use(express.static(__dirname + "/public"));

//当前进入聊天室的人数
var usersNumber = 0;

//客户端通过socket链接服务端
io.on("connection",function(socket) {
    //默认没有用户进入
    var addUser = false;
    
    //客户端发送新的消息
    socket.on("new message",function(data) {
        //广播所有在线客户端新消息的产生
        socket.broadcast.emit("new message",{
            userName: socket.userName,
            message: data
        });
    });
    //客户端发送有用户加入的消息
    socket.on("add user",function(userName) {
        if(addUser) return;
        socket.userName = userName;
        usersNumber++;
        addUser=true;
        //向客户端发送登陆成功
        socket.emit("login",{
            userName: socket.userName,
            usersNumber:usersNumber
        });
        //广播有新用户加入
        socket.broadcast.emit("new user join",{
            userName:socket.userName,
            usersNumber:usersNumber
        });
    });
    //客户端断开链接
    socket.on("disconnect",function() {
        if(addUser) {
            usersNumber--;
            //通知所有客户端有用户离开
            socket.broadcast.emit("user left",{
                userName:socket.userName,
                usersNumber:usersNumber
            });
        }
    });
});

(2) main.js:

$(function(){
    //创建socket与服务端链接
    var socket = io();
    //通过jquery获取dom节点
    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");

    //默认当前登陆输入框为焦点状态
    var $currentInput = $usernameInput.focus();

    //用于记录当前的用户名
    var userName;
    var connect = false;

    //监听服务器是否有新的消息产生,有的话就显示消息到列表
    socket.on("new message",function(data) {
        //在列表框中添加消息,类型为收取的消息
        addNewMessage(data,2);
    });

    //监听服务器是否登陆成功,成功就显示成功登陆
    socket.on("login",function(data) {
        userLogin(data);
    });

    //监听服务器是否有新的用户加入,有的话就显示
    socket.on("new user join",function(data) {
        newUserJoin(data);
    });

    //监听服务器是否有用户离开
    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 + "

  • "); } //当用户点击发送消息时的事件 $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); } }); //当用户点击登陆事件 $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仓库链接
      聊天室链接

      文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

      转载请注明本文地址:https://www.ucloud.cn/yun/80694.html

      相关文章

      • 基于react+react-router+redux+socket.io+koa开发一个聊天

        摘要:最近练手开发了一个项目,是一个聊天室应用。由于我们的项目是一个单页面应用,因此只需要统一打包出一个和一个。而就是基于实现的一套基于事件订阅与发布的通信库。比如说,某一个端口了,而如果端口订阅了,那么在端,对应的回调函数就会被执行。 最近练手开发了一个项目,是一个聊天室应用。项目虽不大,但是使用到了react, react-router, redux, socket.io,后端开发使用了...

        NusterCache 评论0 收藏0
      • vue+socket.io+express+mongodb 实现简易多房间在线群聊

        摘要:项目简介主要是通过做一个多人在线多房间群聊的小项目来练手全栈技术的结合运用。编译运行开启服务,新建命令行窗口启动服务端,新建命令行窗口启动前端页面然后在浏览器多个窗口打开,注册不同账号并登录即可进行多用户多房间在线聊天。 项目简介 主要是通过做一个多人在线多房间群聊的小项目、来练手全栈技术的结合运用。 项目源码:chat-vue-node 主要技术: vue2全家桶 + socket....

        android_c 评论0 收藏0
      • 手把手教你撸一个网页聊天

        摘要:前端逻辑搞定之后,思考一下这个聊天室的交互是怎么实现的。在前端监听一个事件,这个事件的触发条件是成功和服务端建立连接。携带一个参数,即用户的输入。别人发送的消息现在就需要在前端建立一个响应服务端有新消息的监听事件了。 一些废话:) 最近在学校比较闲,终于有这么一块时间可以自由支配了,所以内心还是十分的酸爽舒畅的。当然了,罪恶的事情也是有的,比如已经连续一周没有吃早饭了,其实现在回头想想...

        nemo 评论0 收藏0
      • 手把手教你撸一个网页聊天

        摘要:前端逻辑搞定之后,思考一下这个聊天室的交互是怎么实现的。在前端监听一个事件,这个事件的触发条件是成功和服务端建立连接。携带一个参数,即用户的输入。别人发送的消息现在就需要在前端建立一个响应服务端有新消息的监听事件了。 一些废话:) 最近在学校比较闲,终于有这么一块时间可以自由支配了,所以内心还是十分的酸爽舒畅的。当然了,罪恶的事情也是有的,比如已经连续一周没有吃早饭了,其实现在回头想想...

        leiyi 评论0 收藏0

      发表评论

      0条评论

      Gemini

      |高级讲师

      TA的文章

      阅读更多
      最新活动
      阅读需要支付1元查看
      <