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

下面我将为你详细讲解如何使用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日

相关文章

  • node.js http模块概念详解

    可以的,以下是关于“node.js http模块概念详解”的攻略: 什么是Node.js的http模块? Node.js提供了一个核心模块http,用于创建Web服务器和处理HTTP请求和响应。 如何使用http模块创建服务器? 要使用http模块创建Web服务器,需要执行以下步骤: 首先,需要引入http模块。 const http = require(‘…

    node js 2023年6月8日
    00
  • Node爬虫工具Puppeteer入门教程实践

    Node爬虫工具Puppeteer入门教程实践 什么是Puppeteer? Puppeteer 是 Google 推出的一个 Node 库,通过使用这个库可以方便的控制浏览器并进行网页爬取、数据提取等操作。Puppeteer 使用了类似 Chrome DevTools Protocol 的协议进行通信,所以我们可以直接通过 JavaScript 控制 Chr…

    node js 2023年6月8日
    00
  • JavaScript如何实现图片处理与合成

    实现图片处理和合成可以使用 JavaScript 中的 Canvas API。Canvas API 提供了绘制静态图片和动态交互式内容所需的方法和属性。接下来,我们将讲解如何使用 Canvas API 实现图片处理和合成。 1. 创建 Canvas 元素 首先,我们需要在 HTML 中创建 Canvas 元素,代码示例: <canvas id=&quo…

    node js 2023年6月8日
    00
  • coffeescript使用的方式汇总

    Coffeescript使用的方式汇总 Coffeescript是一种将CoffeeScript代码编译成JavaScript代码的语言。它通过简化JavaScript代码来提高开发人员的生产力,具有简洁、可读、可维护的特点。本文将介绍Coffeescript的使用方式。 安装Coffeescript 要使用Coffeescript,首先需要安装它。在命令行…

    node js 2023年6月8日
    00
  • Koa 中的错误处理解析

    Koa 是一个现代化的 Node.js 框架,具有轻量、高效、可定制等特点。在使用 Koa 进行开发的过程中,经常需要对错误进行处理。本文将为大家详细讲解如何在 Koa 中进行错误处理。 1. 错误处理的重要性 在任何项目中,错误都是难免的。对错误进行及时有效的处理,能够提高程序的鲁棒性和健壮性;而忽略错误的处理,则容易导致应用出现不可预料的问题,甚至引发系…

    node js 2023年6月8日
    00
  • 前端必会的轻量打包工具gulp使用详解

    前端必会的轻量打包工具 gulp 使用详解 什么是 gulp? Gulp是前端打包工具之一,使用它可以自动化执行重复的任务,如文件压缩、文件合并,甚至是将代码编译为可在现代浏览器上运行的 JavaScript。 与其他打包工具相比,Gulp 的特点是学习成本低,易于上手。它采用“代码优于配置”的思想,大量使用 JavaScript 代码来定义任务,方便程序员…

    node js 2023年6月8日
    00
  • 基于nodejs+express(4.x+)实现文件上传功能

    实现文件上传功能是Web开发中常见的需求之一。本文档将详细讲解如何使用nodejs+express(4.x+)实现文件上传功能。 1. 安装express(4.x+)和multer 在开始使用express和multer之前,需要先确保它们已经安装在你的电脑上。 可以通过npm来进行安装: npm install express multer –save …

    node js 2023年6月8日
    00
  • 纯异步nodejs文件夹(目录)复制功能

    下面是“纯异步nodejs文件夹(目录)复制功能”的完整攻略。 一、了解异步编程 在介绍纯异步nodejs文件夹(目录)复制功能之前,需要先了解一下异步编程。 异步编程是指在一个执行单元(A)中调用另一个执行单元(B),而在B执行的同时,执行单元A可以继续执行,不必等待B完成。这种编程方式在Node.js中非常常见,因为Node.js处理大量I/O(输入输出…

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