express框架实现基于Websocket建立的简易聊天室

yizhihongxing

下面我将为你详细讲解如何使用express框架实现基于Websocket建立的简易聊天室。

一、准备工作

在开始实现之前,我们需要准备好以下内容:
- Node.js环境
- 一个基础的express web应用
- WebSocket库socket.io

如果你还没有安装Node.js,请先安装好。安装完成后,在控制台中输入以下命令来安装express和socket.io:

npm install --save express socket.io

二、建立Websocket连接

在app.js中引入socket.io:

const app = express();
const server = require('http').createServer(app);
const io = require('socket.io')(server);

上面的代码中,我们通过createServer()方法创建了一个HTTP服务器,并将其传给socket.io来建立Websocket连接。

三、处理WebSocket连接事件

当客户端与服务端成功建立Websocket连接后,我们需要处理相关事件,这个过程可以通过下面的代码来实现:

io.on('connection', (socket) => {
  console.log('一个用户连接进来了');

  // 监听用户发来的消息
  socket.on('message', (data) => {
    console.log('用户发来一条消息:', data);

    // 广播消息给所有连接进来的用户
    io.emit('message', data);
  });

  // 监听用户断开连接事件
  socket.on('disconnect', () => {
    console.log('一个用户断开连接了');
  });
});

上述代码中,我们通过io.on('connection' ...)方法监听了connection事件,当有用户连接进来时,会触发该事件。在事件的回调中,我们打印了一句Log表示用户连接成功,并通过socket.on('message'...)方法监听了用户发来的消息,接着通过io.emit('message'...)方法广播消息给所有连接进来的用户。最后,我们也监听了disconnect事件,当用户断开连接时打印了一句Log。

四、前端页面

最后,我们需要在前端界面中处理与后端的通信。具体代码如下:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>WebSocket Chat Room</title>
  </head>
  <body>
    <div>
      <label>用户名:</label>
      <input id="username" />
    </div>
    <div>
      <label>消息:</label>
      <input id="message" />
      <button onclick="sendMessage()">发送</button>
    </div>
    <ul id="chatContent"></ul>

    <script src="/socket.io/socket.io.js"></script>
    <script>
      const socket = io();

      // 接收消息
      socket.on('message', (data) => {
        const chatContent = document.getElementById('chatContent');
        const newItem = document.createElement('li');
        newItem.innerText = `[${data.username}]: ${data.message}`;
        chatContent.appendChild(newItem);
      });

      // 发送消息
      function sendMessage() {
        const username = document.getElementById('username').value;
        const message = document.getElementById('message').value;
        socket.send({
          username: username,
          message: message
        });
      }
    </script>
  </body>
</html>

上述代码中,在前端页面中引入了socket.io客户端库,并创建了一个socket实例,接着通过socket.on('message'...)方法监听了服务端发送来的消息,将其添加到聊天内容区域中。同时,我们通过socket.send(...)方法向服务端发送消息。

示例演示

下面我们通过两个简单的示例来演示如何使用express框架实现基于Websocket建立的简易聊天室。

示例一

服务端代码:

const express = require('express');
const app = express();
const server = require('http').createServer(app);
const io = require('socket.io')(server);

app.use(express.static('public'));

io.on('connection', (socket) => {
    console.log('a user connected');

    socket.on('disconnect', () => {
        console.log('user disconnected');
    });

    socket.on('chat message', (msg) => {
        console.log('message: ' + msg);
        io.emit('chat message', msg);
    });
});

server.listen(3000, () => {
    console.log('listening on *:3000');
});

前端页面代码

<!doctype html>
<html>

<head>
  <title>Socket.IO chat</title>
  <style>
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }

    body {
      font: 13px Helvetica, Arial;
    }

    form {
      background: #000;
      padding: 3px;
      position: fixed;
      bottom: 0;
      width: 100%;
    }

    form input {
      border: 0;
      padding: 10px;
      width: 90%;
      margin-right: .5%;
    }

    form button {
      width: 9%;
      background: rgb(130, 224, 255);
      border: none;
      padding: 10px;
    }

    #messages {
      list-style-type: none;
      margin: 0;
      padding: 0;
      text-align: left;
    }

    #messages li {
      padding: 5px 10px;
    }

    #messages li:nth-child(odd) {
      background: #eee;
    }
  </style>
  <script src="/socket.io/socket.io.js"></script>
  <script src="https://code.jquery.com/jquery-1.11.1.js"></script>
  <script>
    $(function() {
      const socket = io();
      $('form').submit(function(e) {
        e.preventDefault(); // prevents page reloading
        socket.emit('chat message', $('#m').val());
        $('#m').val('');
        return false;
      });
      socket.on('chat message', function(msg) {
        $('#messages').append($('<li>').text(msg));
        window.scrollTo(0, document.body.scrollHeight);
      });
    });
  </script>
</head>

<body>
  <ul id="messages"></ul>
  <form action="">
    <input autocomplete="off" id="m" /><button>Send</button>
  </form>
</body>

</html>

示例二

服务端代码

const express = require('express');
const app = express();
const http = require('http').Server(app);
const io = require('socket.io')(http);

app.use(express.static('public'));

io.on('connection', function(socket) {
  console.log('a user connected');

  socket.on('disconnect', function() {
    console.log('user disconnected');
  });

  socket.on('chat message', function(msg) {
    io.emit('chat message', msg);
  });
});

http.listen(3000, function() {
  console.log('listening on *:3000');
});

前端页面代码

<!doctype html>
<html>

<head>
  <title>Socket.IO chat</title>
  <script src="/socket.io/socket.io.js"></script>
</head>

<body>
  <ul id="messages"></ul>
  <form action="">
    <input id="m" autocomplete="off" /><button>Send</button>
  </form>
  <script>
    const socket = io();
    const messages = document.getElementById('messages');
    const form = document.querySelector('form');
    const input = document.querySelector('input');

    form.addEventListener('submit', function(e) {
      e.preventDefault();
      if (input.value) {
        socket.emit('chat message', input.value);
        input.value = '';
      }
    });

    socket.on('chat message', function(msg) {
      const item = document.createElement('li');
      item.textContent = msg;
      messages.appendChild(item);
      window.scrollTo(0, document.body.scrollHeight);
    });
  </script>
</body>

</html>

以上两个示例都是基于Websocket建立的简易聊天室,实现过程类似。只需要将服务端的代码和前端页面进行对应修改即可。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:express框架实现基于Websocket建立的简易聊天室 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • vue中wangEditor5编辑器的基本使用

    Vue中wangEditor5编辑器的基本使用攻略 安装wangEditor5 通过npm进行安装 npm install wangeditor –save 引入wangEditor 在Vue项目的入口文件main.js中引入wangEditor,并且将它挂载到Vue实例上去。 “` import Vue from ‘vue’ import WangEd…

    node js 2023年6月9日
    00
  • JS实现判断对象是否为空对象的5种方法

    以下是JS实现判断对象是否为空对象的5种方法的完整攻略: 方法一:for…in方法 使用for…in遍查对象中是否有属性,如果有则返回false,没有则返回true。 代码示例: function isEmptyObject(obj) { for(var key in obj) { return false; } return true; } con…

    node js 2023年6月8日
    00
  • Node.js使用MySQL连接池的方法实例

    下面是详细的讲解“Node.js使用MySQL连接池的方法实例”的攻略。 准备工作 在使用Node.js连接MySQL数据库之前,需要先安装Node.js和MySQL Server。此外,还需要安装MySQL Node.js驱动程序,可以通过npm命令安装: npm install mysql 连接池的概念 连接池是一种连接数据库的方式。连接池本质上是一组数…

    node js 2023年6月8日
    00
  • Nodejs excel(.xlsx) 文件的读写方式

    关于Node.js对Excel (.xlsx)文件的读写,我们可以使用第三方库 xlsx,它可以轻松地操作Excel文件。 下面给出完整的攻略: 安装 为了使用 xlsx库,需要在项目中进行安装。可以使用npm命令在项目中安装: npm install xlsx –save 读取Excel文件 下面是使用 xlsx读取Excel文件的示例代码: const…

    node js 2023年6月8日
    00
  • node.js中的fs.createWriteStream方法使用说明

    当我们需要在Node.js中向文件中写入数据时,可以通过使用fs模块中提供的createWriteStream方法来实现。下面是使用fs.createWriteStream的完整攻略。 安装 使用fs模块需要先安装Node.js,并且Node.js自带的fs模块无需安装额外依赖。 使用方法 要向文件中写入数据,可以通过以下步骤来使用createWriteSt…

    node js 2023年6月8日
    00
  • 详解Node.js中exports和module.exports的区别

    当我们编写 Node.js 代码时,经常会遇到 exports 和 module.exports,它们都是用来导出模块的。但它们之间有什么区别呢? 1. exports 和 module.exports 区别 在 Node.js 中,每个模块都有一个 module 对象。在 module 对象中,有一个 exports 对象,而且 exports 对象也是 …

    node js 2023年6月8日
    00
  • NodeJs内存占用过高的排查实战记录

    NodeJs内存占用过高的排查实战记录 背景描述 最近在开发一个基于Node.js的Web应用时,发现该应用的内存占用率明显增加,并持续不断地增加,最终导致应用崩溃。为排查这个问题,我记录了如下的实战排查经验,希望能对其他遇到类似问题的开发者有所帮助。 排查步骤 第一步:使用Node.js自带的Profiling工具 在程序启动前配置环境变量 NODE_EN…

    node js 2023年6月8日
    00
  • Node后端Express框架安装及应用

    安装Express框架: 1.首先需要安装Node.js,可以前往Node.js官网下载相应版本的安装包并完成安装。 2.打开命令行工具,输入以下命令安装Express框架: npm install express –save 其中,–save选项将安装的内容添加进package.json文件中,方便后续依赖管理。 3.在项目目录下创建app.js文件,…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部