基于socket.io和node.js搭建即时通信系统

yizhihongxing

下面我将为大家详细讲解搭建基于socket.io和node.js的即时通信系统的完整攻略。

前期准备

在开始搭建之前,我们需要先安装好node.js和npm。建议使用nvm管理node.js版本。

步骤1:新建工作目录

首先需要新建一个工作目录,我们可以在控制台中输入以下命令:

mkdir chat-demo

进入该目录:

cd chat-demo

步骤2:初始化项目

使用npm初始化一个工程:

npm init

按照提示,依次输入信息,这样就可以得到一个package.json文件,其中包含了我们新的node.js工程的配置信息。

步骤3:安装依赖

在chat-demo目录下,执行下列命令,安装socket.io和express:

npm install --save socket.io
npm install --save express

步骤4:创建服务端代码

创建一个叫做server.js的文件,代码如下:

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

const port = process.env.PORT || 3000;

server.listen(port, () => {
    console.log(`Server is running on port ${port}`);
});

io.on('connection', (socket) => {
    console.log('A new client connected');
    socket.emit('welcome', 'Welcome to the chatroom!');

    socket.on('chat', (data) => {
        console.log(`Received new message: ${data}`);
        io.emit('chat', data);
    });
});

上面的代码中,我们使用了express搭建了一个http服务器,并使用socket.io初始化了一个Socket.IO服务器对象。

在服务器的connection事件中,我们能够监听到新建立的连接事件,socket.on('chat')能够监听到客户端发来的消息,io.emit('chat')则能够将这个消息发送给所有连接到服务器的客户端。

步骤5:创建前端代码

在chat-demo目录下,创建一个叫做index.html的文件,代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Chat Demo</title>
</head>
<body>
    <h1>Chat Room</h1>
    <div id="chat-messages"></div>
    <textarea id="chat-input"></textarea>
    <button id="send-btn">Send</button>
    <script src="/socket.io/socket.io.js"></script>
    <script>
        const socket = io();
        const chatInput = document.getElementById('chat-input');
        const chatMessages = document.getElementById('chat-messages');
        const sendBtn = document.getElementById('send-btn');

        socket.on('welcome', (msg) => {
            console.log(msg);
        });

        socket.on('chat', (msg) => {
            const newMsg = document.createElement('div');
            newMsg.innerHTML = msg;

            chatMessages.appendChild(newMsg);
        });

        sendBtn.addEventListener('click', () => {
            const msg = chatInput.value;
            socket.emit('chat', msg);
        });
    </script>
</body>
</html>

在这个文件中,我们使用了Socket.IO的JavaScript客户端库,获取Socket.IO服务器的连接对象,然后监听到了服务器的welcomechat事件。其中,sendBtn是用来发送消息的按钮。

步骤6:启动应用

最后,在chat-demo目录下执行以下命令启动服务器:

node server.js

在浏览器中访问http://localhost:3000,即可进入实时聊天室。

示例说明

以下是两个示例说明:

示例1:私人聊天

我们可以增加一个私人聊天功能。在server.js中添加如下代码:

socket.on('privateChat', (data) => {
    const recipientSocket = io.sockets.connected[data.to];
    const senderSocket = io.sockets.connected[data.from];

    if (recipientSocket) {
        recipientSocket.emit('privateChat', data.message);
        senderSocket.emit('privateChat', data.message);
    }
});

然后在index.html中添加一些输入框和按钮来支持私人聊天:

<label for="private-to">To:</label>
<input type="text" id="private-to"><br>
<label for="private-message">Message:</label>
<input type="text" id="private-message"><br>
<button id="private-send-btn">Send</button>
<script>
    // 略
    const privateTo = document.getElementById('private-to');
    const privateInput = document.getElementById('private-message');
    const privateSendBtn = document.getElementById('private-send-btn');

    privateSendBtn.addEventListener('click', () => {
        const to = privateTo.value;
        const msg = privateInput.value;
        socket.emit('privateChat', {
            to: to,
            from: socket.id,
            message: msg
        });
    });

    socket.on('privateChat', (msg) => {
        const newMsg = document.createElement('div');
        newMsg.innerHTML = "(Private) " + msg;

        chatMessages.appendChild(newMsg);
    });
</script>

这样,就完成了一个简单的私人聊天功能。

示例2:实现登录机制

我们可以通过增加一个登录功能来限制用户访问聊天室。在服务器中,添加如下代码:

app.get('/', (req, res) => {
    res.sendFile(__dirname + '/login.html');
});

app.post('/', (req, res) => {
    const username = req.body.username;
    if (username) {
        res.sendFile(__dirname + '/index.html');
    } else {
        res.redirect('/');
    }
});

接着,我们在chat-demo目录下,创建一个叫做login.html的文件,代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
    <h1>Login</h1>
    <form action="/" method="post">
        <label for="username">Username:</label>
        <input type="text" id="username" name="username">
        <br>
        <button type="submit">Login</button>
    </form>
</body>
</html>

这样,就可以在实现一个简单的登录机制了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于socket.io和node.js搭建即时通信系统 - Python技术站

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

相关文章

  • js AppendChild与insertBefore用法详细对比

    当我们要向HTML页面中增加新的元素节点时,可以使用JS的appendChild和insertBefore方法。两者都可以用于向一个父元素节点中添加一个子元素节点,但有些细节不同。下面是对比它们的用法的详细攻略。 使用appendChild方法 appendChild方法是用于在一个元素节点的子节点列表的末尾添加一个新的子元素节点。其语法如下: parent…

    node js 2023年6月8日
    00
  • JavaScript之WebSocket技术详解

    JavaScript之WebSocket技术详解 什么是WebSocket? WebSocket 是一种HTML5的协议,它是一种在浏览器和服务器之间进行实时双向通讯的技术,可以像TCP一样进行全双工通讯。 WebSocket 协议与 http 协议兼容,使用与 http 相同的端口,一般是 80 和 443 端口。 和传统的 http 请求不同,WebSo…

    node js 2023年6月8日
    00
  • 深入了解 Node的多进程服务实现

    以下是关于“深入了解 Node 的多进程服务实现”的完整攻略: 一、为什么要使用多进程服务? 在 Node 的单线程模型中,若一个请求过于耗时,那么后续的请求便会被阻塞,导致程序响应缓慢,用户体验下降。因此,使用多进程服务可以将请求分配给多个进程进行处理,避免由于一个过于耗时的请求而导致其他请求的阻塞,从而提高程序的稳定性和性能。 二、Node 服务的多进程…

    node js 2023年6月8日
    00
  • node基于express框架操作Mysql数据库的步骤

    下面我来为您详细讲解如何基于Express框架操作Mysql数据库,步骤如下: 1. 安装依赖 首先,我们需要安装以下依赖: npm install express mysql –save 其中,express 是框架,mysql 是操作 Mysql 数据库的库。–save 表示将依赖保存到 package.json 文件中。 2. 配置数据库连接 在程…

    node js 2023年6月8日
    00
  • npm国内镜像 安装失败的几种解决方案

    npm国内镜像 安装失败的几种解决方案 为什么需要使用npm国内镜像? npm是一个万物皆可安装的丰富资源库,我们经常会使用npm来获取很多工具和第三方库。但是,由于我们的网络环境和国外的npm服务器环境之间距离较远,因此在下载安装npm包时可能会出现访问和网络延迟的问题,导致npm包无法下载或下载速度缓慢。为了解决这个问题,我们可以使用国内的npm镜像,加…

    node js 2023年6月8日
    00
  • Nodejs下用submit提交表单提示cannot post错误的解决方法

    当我们在Node.js环境下使用submit提交表单时,有时会出现“cannot post”错误,这是因为Node.js的http模块并不支持表单类型的提交方式。在这种情况下,我们需要对请求进行处理,以使其能够正确地被Node.js服务器处理。下面详细讲解如何解决这个问题。 首先,在Node.js中,我们可以使用http模块来创建一个服务器。使用该模块创建的…

    node js 2023年6月8日
    00
  • VScode中配置JavaScript编译环境的方法

    首先我们需要明确几点: 配置JavaScript编译环境并不是必需的操作。VS Code是一款轻量的代码编辑器,它并不需要额外的编译环境来运行JavaScript代码。但是,如果你想使用一些VS Code的扩展或插件,如Debug工具、Linters等,那么配置一个JavaScript编译环境是有必要的。 本文所提到的配置JavaScript编译环境,主要指…

    node js 2023年6月8日
    00
  • 一文带你搞懂Node中的流

    一文带你搞懂Node中的流 什么是流 在Node.js中,流(Stream)是一种处理数据的抽象接口,是在处理大量数据时一种更加高效、可读性更强的解决方案。 流的本质就是ReadStream和WriteStream,它可以分为读流和写流。 Readable 读流也就是Readable,它是一个抽象类,不能用它自己,需要继承它后才能用。Readable提供了一…

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