热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

教你使用socket.io写一个简单聊天室

功能简介输入名字进行登录发送消息登录另一个用户发送消息观察张曼玉用户,可以发现消息也可以显示在上面代码实现思维导图server.jsconstexpressreq

功能简介

在这里插入图片描述

  • 输入名字进行登录
    在这里插入图片描述
    在这里插入图片描述
  • 发送消息
    在这里插入图片描述
    在这里插入图片描述
  • 登录另一个用户
    在这里插入图片描述
  • 发送消息
    在这里插入图片描述
    在这里插入图片描述
  • 观察张曼玉用户,可以发现消息也可以显示在上面
    在这里插入图片描述

代码实现


  • 思维导图
    在这里插入图片描述
  • server.js

    const express = require('express');
    const app = express();
    const server = require('http').createServer(app);
    const io = require('socket.io').listen(server).sockets;app.get('/',(req,res) => {res.sendFile(__dirname+'/index.html');});let connectedUser =[];// 一个客户端io对应一个服务端io
    io.on("connection", socket =>{console.log("a user connected");updateUserName();let userName = '';//loginsocket.on('login', (name, callback) =>{if(name.trim().length ===0){return;}callback(true);userName= name;connectedUser.push(userName);// console.log(connectedUser);updateUserName();})//receive chat messagesocket.on('chat message', msg =>{console.log(msg);//emit message dataio.emit("output", {name:userName,msg:msg});})//disconnectsocket.on('disconnect', () =>{console.log('disconneted');connectedUser.splice(connectedUser.indexOf(userName),1);console.log(connectedUser);updateUserName();});function updateUserName(){io.emit('loadUser',connectedUser);}
    })const port = process.env.PORT || 5000;
    server.listen(port , () =>{console.log('server running...');
    });

  • index.html

    DOCTYPE html>
    <html><head><link href &#61; "https://fonts.googleapis.com/icon?family&#61;Material&#43;Icons" rel &#61;"stylesheet"><link rel&#61;"stylesheet" href&#61;"https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css"><meta name &#61; "viewpoint" content &#61; "width-device-width, initial-scale&#61;1.0" /><title>Let&#39;s Chat!title>head><body><nav><div class &#61; "nav-wrapper "><a href&#61;"#" class &#61; "brand-logo center"> Let&#39;s Chat!a>div>nav><div class &#61; "row"><div class &#61; "col s4"><h3 class &#61; "flow-text center teal-text text-lighten-1">CONNECTED USERh3><ul class &#61; "collection" id &#61; "user-list">ul>div><div id &#61; "chat-col" class&#61;"col s8" style&#61;"display:none"><div class&#61;"card blue-grey darken-1"><div class&#61;"card-content white-text" id &#61;"messages">div><div class&#61;"card-action white"><form id&#61;"message-form"><div class &#61;"input-field"><textarea type &#61; "text" id &#61; "textarea" class &#61;"materialize-textarea">textarea><label class&#61;"active" for &#61; "textarea">MESSAGElabel>div><div class&#61;"right-align"><button class&#61;"btn waves-effect waves-light btn-small" type&#61;"submit" name &#61; "action">SEND<i class &#61; "material-icons right">sendi>button>div>form>div>div>div><div id &#61; "login-col" class&#61;"col s8" style&#61;"display:block"><div class&#61;"card"><div class&#61; "card-content"><span class&#61;"card-title teal-text text-lighten-1">Give yourself a nicknamespan><form id &#61; "login-form"><div class&#61;"input-field"><input type &#61; "text" id &#61; "name"><label class&#61;"active" for &#61; "name">Namelabel>div><div class &#61; "right-align"><button class &#61; "btn waves-effect waves-light btn-small" type&#61;"submit" name &#61; "action">Let&#39;s Chat!<i class &#61; "material-icons right">chati>button>div>form>div>div>div>div><script src&#61;"https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js">script><script src &#61; "https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js">script><script>(function(){//get elementconst loginForm &#61; document.getElementById(&#39;login-form&#39;);const messageForm &#61; document.getElementById(&#39;message-form&#39;);const messages &#61; document.getElementById(&#39;messages&#39;);const userList &#61; document.getElementById(&#39;user-list&#39;);const loginCol &#61; document.getElementById(&#39;login-col&#39;);const chatCol &#61; document.getElementById(&#39;chat-col&#39;);// connect to socket.iovar socket &#61; io({&#39;timeout&#39;:5000, &#39;connect timeout&#39;:5000});//check for connectionsif(socket !&#61;&#61; undefined){console.log(&#39;connected to socket&#39;);}// Update user listsocket.on("loadUser", users &#61;> {userList.innerHTML &#61; ""users.forEach(user &#61;> {var userLi &#61; document.createElement("li")userLi.setAttribute("class", "collection-item")userLi.innerHTML &#61; &#96;

    ${user}
    &#96;userList.insertBefore(userLi, userList.lastChild)})})// submit login formloginForm.addEventListener(&#39;submit&#39;,e &#61;> {e.preventDefault();const userName &#61; document.getElementById(&#39;name&#39;).value;//emit loginsocket.emit(&#39;login&#39;, userName, () &#61;> {loginCol.style &#61; "display:none";chatCol.style &#61; "display: block";//add welcome messagelet message &#61; document.createElement(&#39;p&#39;);message.setAttribute(&#39;class&#39;,&#39;center blue-grey-text text-lighten-2&#39;);message.textContent &#61; &#96;Welcome ${userName} joined Chat!&#96;;messages.appendChild(message)messages.insertBefore(message, messages.lastElementChild)})})// Submit MessagemessageForm.addEventListener("submit", e &#61;> {e.preventDefault()const msg &#61; document.querySelector("textarea").valuedocument.querySelector("textarea").value &#61; ""socket.emit("chat message", msg)})// Add message to cardsocket.on("output", data &#61;> {let message &#61; document.createElement("h6")message.textContent &#61; data.name &#43; ": " &#43; data.msgmessages.appendChild(message)messages.insertBefore(message, messages.lastChild)})})();script>body>
    html>

推荐阅读
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
author-avatar
LoveCherryz
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有