基于node.js,socket.io,原生js实现的在线实时聊天程序

目录

网络程序设计专题报告

一、项目简介

二、准备工作

三、前端实现

3.1前端代码实现

3.2前端效果展示

 四、后端实现

4.1后端代码实现

4.2session数据持久化

4.3最终效果展示

五、总结 


网络程序设计专题报告

学号:329

一、项目简介

本聊天系统是基于node.js,socket.io,原生js实现在线聊天web。

Socket.IO 是一个库,可以在客户端和服务器之间实现 低延迟双向 和 基于事件的 通信。

前端页面的开发使用Vue框架进行,并使用了简单的原生js开发的一个简单页面。

本文将使用Node.js加web socket协议打造一个网页即时聊天程序。

源码可访问项目的Github仓库进行查看,下载,并进行本地部署

本地运行方法:

  1. 在文件夹中打开终端,命令行运行npm i
  2. 在文件夹中,打开终端并运行 npm run start 
  3. 打开浏览器访问localhost

下图为项目预览效果图:

二、准备工作

本文示例环境为Windows,Linux也就Node的安装与命令行稍有区别,程序实现部分与平台无关。

  • 你需要在本机安装Node.js,建议版本为18.16.1以上,以下并未进行过测试
  • 多少需要一点Node.js的基础知识,因为未曾了解过Node.js的话,你可能连项目都运行不起来
  • Node.js中使用socket的一个包,可以很方便地建立服务器到客户端的sockets连接,发送事件与接收特定事件,因此你需要安装这个包: npm install socket.io。安装这个包可能遇到npm报错,报错的原因可能是你之前使用过cnpm的原因,因此报错了使用cnpm下载依赖包即可。

三、前端实现

3.1前端代码实现

为了可以在程序运行时实时的发送消息,使用js中的钩子方法进行相关消息的接收:

 mounted() {}

实现登录:

login() {
            if (this.userInfo.name == "") {
                this.Toast("输入你姓名,第一宇宙战士", "alert-danger");
                return;
            }
            this.socket.emit("login", {
                ...this.userInfo
            })
        }

简单的socket连接以及登录提示:

const socket = io.connect("/");
        this.socket = socket;

        socket.on("message", (mes) => {
            this.Allmessage.push(mes)

        })
        socket.on("login", (userInfp) => {
            if (userInfp["repeat"]  === true)
             {
                this.Toast(`群星名称:${userInfp.name},重复,请重新输入`, "alert-danger");   
            }else
            {
                if (this.userInfo.name !== userInfp.name) {
                    this.Toast(`宇宙大帝之一:${userInfp.name}上线了,快来和他聊天吧~`, "alert-info");
                } else {
                    this.Toast(`尊贵的宇宙大帝:${userInfp.name},欢迎进入宇宙聊天群`, "alert-info");
                    this.userInfo = userInfp
                    this.main = false;
                    socket.emit("init", JSON.stringify(this.userInfo))
                }
            }
         
        })

对接收到的数据userInfp进行相关判断,并输出。就可以实现简单的接收后端消息了。js是脚本语言,${userInfp.name}也就是一个取值的过程。

退出聊天群的提示实现:

socket.on("loginOut", (userInfo) => {
            this.Toast(`宇宙大帝:${userInfo.name}已下线~`, "alert-info")
            let newList = this.userList.map(user => {
                if (user.name === userInfo.name) {
                    user.onLine = false;
                }
                return user
            })
            this.userList = newList
        })

剩下更多的内容,如果想要了解,可以前往代码仓库查看。

3.2前端效果展示

登录页面:

进入聊天系统提示:

 退出聊天系统提示:

 四、后端实现

4.1后端代码实现

实现端口监听:

const http = require("http")
const moment = require("moment");
const express = require('express');
const app = express()
app.use(express.static('src'))
const server = require('http').createServer(app);
const io = require('socket.io')(server);
server.listen(8080, function () {
    console.log("node server run at " + 'http://localhost:8080');
})

实现登录功能:

socket.on("login", function (userInfo) {

        if (userInfoList.some(u => u.name === userInfo.name && u.onLine === true)) {
            userInfo.repeat = true;
            socket.emit("login", userInfo) 
        } else {
            userInfo.id = socket.id
            userInfo.onLine = true
            if (userInfoList.every(user => user.name !== userInfo.name)) {
                userInfoList.push(userInfo)
                console.log("登录群星聊天系统成功");
            } else {
                let oldUserIndex = userInfoList.findIndex(user => user.name === userInfo.name)
                userInfoList[oldUserIndex] = userInfo;
                console.log("再次登录群星聊天系统成功");
            }
            io.emit("login", userInfo) 
        }
    })

 实现列表初始化:

socket.on("init", function (userInfo) {
        io.emit("init", {
            user: userInfoList,
            room: roomList,
            message: messageList
        })
    })

4.2session数据持久化

const USER = 'user'
const HISTORY = 'history'
export const getUserList = () => {
  const result = sessionStorage.getItem(USER)
  return result ? JSON.parse(result) : []
}
export const setUser = (user) => {
  sessionStorage.setItem(USER, JSON.stringify(user))
}
export const getHistoryMessage = () => {
  const mesg = sessionStorage.getItem(HISTORY)
  return mesg ? JSON.parse(mesg) : []
}// 获取之前的消息
export const setHistoryMessage = (history) => {
  sessionStorage.setItem(HISTORY, JSON.stringify(history))// 更新新的记录消息

4.3最终效果展示

五、总结 

经过上面一番折腾,一个基本的聊天程序便打造完毕。在本次实验过程中,我学习到了网络通信,尤其是websocket的原理以及socket.io库的使用。经过一次项目的具体使用过程,让我对socket.io有了一个相对明确的认识,使我对socket有了从0到1的认识。

  • 19
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值