node+socket实现简易聊天室功能

下面是使用node+socket实现简易聊天室功能的完整攻略:

一、安装Node.js

Node.js是一个JavaScript运行时环境,可以使用JavaScript进行服务器端编程。我们需要在本地先安装Node.js才能进行后续操作。

二、安装Socket.io

Socket.io是一个实现实时双向通信的JavaScript库。我们可以使用Socket.io来构建聊天室程序。安装方法:

npm install socket.io

三、简易聊天程序示例

下面是一个简易聊天程序的示例:

  1. HTML文件
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Socket.io 聊天室示例</title>
</head>
<body>
    <ul id="messages"></ul>
    <form action="">
        <input id="m" autocomplete="off"/>
        <button>发送</button>
    </form>
    <script src="/socket.io/socket.io.js"></script>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <script>
        var socket = io();
        $('form').submit(function(e){
            e.preventDefault();
            socket.emit('chat message', $('#m').val());
            $('#m').val('');
            return false;
        });
        socket.on('chat message', function(msg){
            $('#messages').append($('<li>').text(msg));
        });
    </script>
</body>
</html>
  1. 服务器代码
const express = require('express');
const app = express();

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

app.get('/', function(req, res){
    res.sendFile(__dirname + '/index.html');
});

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

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

这个简单的聊天程序的意思是:当用户在页面上输入消息并点击“发送”按钮时,使用Socket.io客户端将消息发送到服务器,然后服务器会再次使用Socket.io将此消息发送到所有客户端。

四、进阶实例

下面是一个更完整的聊天程序实例,其中包含用户登录、房间选择等功能:

  1. HTML文件
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Socket.io 聊天室示例</title>
</head>
<body>
    <div id="login">
        <h2>登录</h2>
        <form>
            <div>
                <label>用户名:</label>
                <input type="text" name="username" id="username"/>
            </div>
            <div>
                <label>密码:</label>
                <input type="text" name="password" id="password"/>
            </div>
            <div>
                <button id="loginBtn">登录</button>
            </div>
        </form>
    </div>
    <div id="chat" style="display:none">
        <h2>聊天室</h2>
        <div id="channels">
            <h3>选择一个房间</h3>
            <ul id="channelList"></ul>
        </div>
        <div id="chatBox" style="display:none">
            <ul id="messages"></ul>
            <form>
                <input type="text" name="message" id="message" autocomplete="off"/>
                <button id="sendBtn">发送</button>
            </form>
        </div>
    </div>
    <script src="/socket.io/socket.io.js"></script>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <script>
        var socket = io();
        $('#loginBtn').on('click', function(e){
            e.preventDefault();
            var username = $('#username').val();
            var password = $('#password').val();
            socket.emit('login', {username: username, password: password});
        });
        socket.on('login success', function(user){
            $('#login').hide();
            $('#chat').show();
            for(var i = 0; i < user.channels.length; i++) {
                var channel = user.channels[i];
                $('#channelList').append('<li><a href="#" data-channel="' + channel + '">' + channel + '</a></li>');
            }
        });
        $(document).on('click', '#channelList a', function(e){
            e.preventDefault();
            var channel = $(this).data('channel');
            $('#channels').hide();
            $('#chatBox').show();
            $('#messages').empty();
            socket.emit('join channel', channel);
        });
        $('#sendBtn').on('click', function(e){
            e.preventDefault();
            var message = $('#message').val();
            socket.emit('chat message', message);
            $('#message').val('');
        });
        socket.on('chat message', function(data){
            $('#messages').append($('<li>').text(data.username + ': ' + data.message));
        });
    </script>
</body>
</html>
  1. 服务器代码
const express = require('express');
const app = express();

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

const users = [];

app.get('/', function(req, res){
    res.sendFile(__dirname + '/index.html');
});

io.on('connection', function(socket){
    socket.on('login', function(data){
        var user = {username: data.username, channels: ['公共频道']};
        users.push(user);
        socket.emit('login success', user);
    });
    socket.on('join channel', function(channel){
        socket.join(channel);
    });
    socket.on('chat message', function(msg){
        var user = null;
        for(var i = 0; i < users.length; i++) {
            if(users[i].username === socket.client.conn.remoteAddress) {
                user = users[i];
                break;
            }
        }
        if(user === null) {
            throw new Error('无效的用户');
        }
        var message = {username: user.username, message: msg};
        io.emit('chat message', message);
    });
});

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

这个聊天程序包含了用户登录和房间选择的功能。当用户点击“登录”按钮时,客户端将用户名和密码发送到服务器进行验证。如果验证成功,服务器会将用户添加到用户列表中,并向客户端发送“login success”消息。然后,客户端会显示一个包含各种房间的列表,用户可以选择其中的一个。客户端将所选频道名称发送到服务器,并加入该频道。在聊天室中,当用户提交表单发送消息时,客户端会向服务器发送“chat message”消息,同时将消息显示在页面上。服务器再将此消息广播到所有客户端。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:node+socket实现简易聊天室功能 - Python技术站

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

相关文章

  • node中的session的具体使用

    当在Web应用程序中存储用户数据时,会使用会话(Session)来跟踪和维护用户状态。通常情况下,使用session需要在Web框架中配置和使用,但是在Node.js中,我们可以使用一个非常流行的中间件——express-session来实现会话管理。 安装 npm install express-session 使用 在Express应用程序中使用expr…

    node js 2023年6月8日
    00
  • Nodejs封装类似express框架的路由实例详解

    下面是关于“Nodejs封装类似express框架的路由实例详解”的完整攻略。 前言 首先,我们需要了解一下什么是路由(Routing)。在Web开发中,路由的作用是将请求(URL)和处理函数对应起来,使得不同的请求请求会被分配到相应的处理函数中。这种映射关系就是路由。在Node.js中,我们可以使用原生的http模块来实现基本的路由。但是,使用原生路由实现…

    node js 2023年6月8日
    00
  • webpack打包、编译、热更新Node内存不足问题解决

    下面我来详细讲解一下关于“webpack打包、编译、热更新Node内存不足问题解决”的完整攻略。本文将分为以下几个步骤: 了解webpack打包、编译、热更新的原理 解决Node内存不足问题 1. 了解webpack打包、编译、热更新的原理 1.1 webpack打包原理 webpack是一个模块打包工具,可以将多个模块按照一定的顺序打包成一个或多个文件。w…

    node js 2023年6月8日
    00
  • Node.js 搭建后端服务器内置模块( http+url+querystring 的使用)

    下面是“Node.js 搭建后端服务器内置模块(http+url+querystring的使用)”的完整攻略。 简介 Node.js 是一个使用 JavaScript 编写的跨平台的后端程序。在 Node.js 中,内置了许多模块,包括用于搭建服务器的 http、用于解析 URL 地址的 url,以及用于解析查询字符串的 querystring 等模块。 在…

    node js 2023年6月8日
    00
  • javascript实现Emrips反质数枚举的示例代码

    实现Emirps反质数枚举的示例代码可以通过以下步骤完成: 1. 确定问题 要实现Emirps反质数枚举,首先需要明确Emirps反质数的概念。Emirps反质数是指一个质数经过倒置后得到的新数仍为质数,并且这个新数不等于原数。例如,13是一个质数,倒置后得到31也是质数,因此13和31都是Emirps反质数。 枚举Emirps反质数要求先枚举出所有的质数,…

    node js 2023年6月8日
    00
  • node.JS事件机制与events事件模块的使用方法详解

    Node.JS事件机制与events事件模块的使用方法详解 1. Node.JS事件机制 Node.js采用事件驱动的机制,它的核心是事件循环(Event Loop)。在Node.js中,许多对象都会触发事件,例如一个HTTP服务器,一个TCP连接等等。所有能触发事件的对象都是 EventEmitter 类的实例。EventEmitter 类被定义在 eve…

    node js 2023年6月8日
    00
  • 面试常见的js算法题

    下面是“面试常见的js算法题”的完整攻略。 理解算法 在学习算法之前,需要明确算法的定义。算法是一组解决问题的清晰指令,旨在提高计算机程序的运行效率和质量。 算法分类: 基础算法:搜索、排序、数据结构、图论、动态规划等 经典问题:背包问题、旅行商问题、图的最大独立集等 设计思想:分治、贪心、动态规划等 面试算法:时间、空间、复杂度分析、常见问题的解决方法等 …

    node js 2023年6月8日
    00
  • Nodejs学习笔记之入门篇

    Node.js学习笔记之入门篇攻略 简介 本篇文章主要针对初学者,介绍Node.js的入门知识和基本概念,包括Node.js的使用场景,安装及配置,模块和包管理机制等,旨在帮助读者快速了解Node.js的基础知识,为进一步学习打下基础。 使用场景 Node.js是一种JavaScript运行环境,具有事件驱动、非阻塞I/O等特性,广泛应用于Web应用开发、后…

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