websocket实现一个简单聊天框
websoket在客户端的使用
事件:open/message/error/close
方法:send/close
var socket = new WebSocket(url)// 服务连接成功时触发
socket.addEventListener('open', function() {console.log("连接成功了")
})// 主动给websocket发消息
socket.send('hello')// 接收websocket的消息
socket.addEventListener('message', function(e) {console.log("客户端收到数据了", e.data)
})// 服务断开时触发
socket.addEventListener('close', function() {console.log("服务断开连接")
})
websocket在服务端怎么用
事件:text/close/error等
const ws = require('nodejs-websocket')// 获取浏览器的数据并给浏览器发送数据
var server = ws.createServer(function(conn) {console.log('接收到了新的连接')conn.on('text', data => {// 收到的消息console.log(data)conn.send(data.toUpperCase())})// 关闭连接时触发conn.on('close', data => {console.log('连接断开了')})// 发生异常时触发conn.on('error', data => {console.log('连接出错了')})
})server.listen(3000, () => {console.log('服务器启动成功了, 监听端口3000')
})
使用socketio实现简单聊天室
准备: 安装一些依赖包 nodejs-websocket等
服务端:
var app = require('express')()
var server = require('http').Server(app)
var io = require('socket.io')(server)
const users = [] // 已登录的用户信息server.listen(3000, () => {console.log('服务器启动成功了')
})// express处理静态资源
// 把public目录设置成静态资源目录
app.use(require('express').static('public'))
app.get('/', function(req, res) {res.redirect('./index.html')
})io.on('connection', function(socket) {// 每个用户连接都会有一个socketsocket.on('login', data => {// 判断,如果data在user中存在,说明已经登录了,不允许登录。否则允许登录let user = users.find(item => item.username === data.username)if (user) {socket.emit('loginError', { msg: '登录失败' })} else {// 表示不存在users.push(data)// 告诉当前用户socket.emitsocket.emit('loginSuccess', data)// 广播消息,告诉所有用户io.emit,有用户加入聊天室io.emit('addUser', data)// 告诉所有用户当前群聊有多少人io.emit('userList', users)//把登录成功的用户名和头像存储起来socket.username = data.usernamesocket.avatar = data.avatar }})// 用户断开连接的功能socket.on('disconnect', () => {// 把当前用户信息删除掉let idx = users.findIndex(item => item.username === socket.username)users.splice(idx, 1)// 告诉所有人有人离开io.emit('delUser', {username: socket.username,avatar: socket.avatar})// userList发生变化io.emit('userList', users)})// 监听聊天的消息socket.on('sendMessage', data => {// 广播给所有用户io.emit('receiveMessage', data)})// 接收图片信息socket.on('sendImage', data => {// 广播给所有用户io.emit('receiveImage', data)})
})
客户端:
<script src="/socket.io/socket.io.js"></script>// 1、连接socketio服务
var socket = io('http://localhost:3000')
var username, avatar// 2、登录功能
socket.emit('login', {username: username,avatar: avatar
})socket.on('loginError', data => {alert('用户名已存在')
})socket.on('loginSuccess', data => {alert('登录成功')username = data.usernameavatar = data.avatar
})// 监听添加用户的信息
socket.on('addUser', data => {alert(data.username + '加入了群聊')
})// 监听所有用户的信息
socket.on('userList', data => {alert('当前人员有' + data)
})// 监听用户离开的信息
socket.on('delUser', data => {alert(data.username + '下线了')
})// 给服务器发消息
socket.emit('sendMessage', {msg: content,username: username,avatar: avatar
})// 监听聊天的消息
socket.on('receiveMessage', data => {// 把接收到的消息显示到窗口中if (data.username === username) {// 自己的消息显示在右边} else {// 显示在左边}
})// 发送图片给服务器
var file = ...
var fr = new FileReader()
fr.readAsDataURL(file)
fr.onload = function() {socket.emit('sendImage', {msg: content,username: username,image: fr.result})
}// 监听图片聊天记录
socket.on('receiveImage', data => {// 把接收到的图片显示到窗口中if (data.username === username) {// 自己的消息显示在右边} else {// 显示在左边}
})
相关文章:
websocket实现一个简单聊天框
websoket在客户端的使用 事件:open/message/error/close 方法:send/close var socket new WebSocket(url)// 服务连接成功时触发 socket.addEventListener(open, function() {console.log("连接成功了") })// 主动给websocket发消息 socket…...
Docker-安装应用
一、安装Tomcat 注意:新版Tomcat安装之后启动访问会出现404 修改:删除原有的webapps目录,修改webapps.dist为webapps 免修改版本:billygoo/tomcat8-jdk8 二、安装Mysql 1、安装 拉取镜像 docker pull mysql:5.7 运行镜像…...
Web3中的营销:如何在2023年获得优势
Mar. 2022, Daniel在过去的一年里,让人们对你的Web3项目或协议感兴趣已经变得越来越有挑战性。许多曾经充满希望的项目因为各种不同的原因,都在熊市中倒下了。然而,那些迄今为止幸存下来的项目都有一个共同点:强大的社区。Web3营销…...
Java中==和equals区别
文章目录Java中和equals区别1. Integer中和equals的问题1.1 Integer类型且不是通过new创建的比较1.2 手动new Integer()创建的比较1.3 Integer和int比较2. String中和equals的问题3. DemoJava中和equals区别 equals是方法,是运算符: 如果比较的对象是基…...
计算机科学导论笔记(三)
五、计算机组成 计算机组成部件可以分为三大类(子系统):中央处理单元(CPU)、主存储器和输入/输出子系统。 5.1 中央处理单元(CPU) 中央处理单元用于数据的运算,分为算术逻辑单元&a…...
Stream——数字类型的字符串排序
文章目录前言什么是数字类型的字符串一个简单的坑demo拯救坑代码对象集合中的数字类型排序(有坑)对象集合中的数字类型排序 解决扩展将数字类型字符串数组转换为Integer集合总结前言 想到给数据进行排序,一开始头脑中想到的就是sorted(),本篇文章重点说…...
.NET 8 预览版 1 发布!
.NET 8 是一个长期支持(LTS) 版本。这篇文章涵盖了推动增强功能优先级排序和选择开发的主要主题和目标。.NET 8 预览版和发布候选版本将每月交付一次。像往常一样,最终版本将在 11 月的某个时候在 .NET Conf 上发布。 .NET 版本包括产品、库、运行时和工具…...
WebGIS学习路线
7年经验的webgis码农在此文跟大家分享一些一路走来的所见所闻。希望能帮助刚刚跨入这个门槛的你。 入门之前我相信你已经搞清楚了以下几个问题: 1.什么是webgis? 2.webgis能够解决什么样的问题? 3.为什么你要学习webgis? 如果还没考虑清楚也没关系,可能你看完这篇文章…...
【独家】华为OD机试 - 停车场最大距离(C 语言解题)
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明本期…...
12.typedef的使用与结构体定义
欢迎访问个人网络日志🌹🌹知行空间🌹🌹 文章目录1.基础介绍2.typedef 的常用的几种情况3.使用typedef可能出现的问题参考资料1.基础介绍 typedef是C/C语言中保留的关键字,用来定义一种数据类型的别名。 typedef并没有…...
宝塔+docker+jenkins部署vue项目(保姆级教程)
1.使用宝塔安装docker 在软件商城安装Docker管理器 2.使用docker下载jenkins镜像 使用命令行 docker pull jenkins/jenkins:lts //lts表示支持版本较长3.创建并且挂载jenkins目录并赋值 jenkins_home为我创建的目录 可以修改任意目录 mkdir -p /jenkins_home cho…...
JVM面试总结
1.java内存模型JMM是java的内存模型,JMM-也叫Java Memory Model,这里反应翻译成存储更好,因为工作内存指的不是内存.而是CPU寄存器,主内存才是内存.屏蔽了各种硬件和操作系统的内存访问差异-把硬件的细节封装起来,实现让java程序在各平台下都能达到一致的内存访问效果,它定义了…...
C语言——文件操作
文章目录0. 思维导图1. 为什么使用文件2. 什么是文件2.1 程序文件2.2 数据文件2.3 文件名3. 文件的打开和关闭3.1 文件指针3.2 文件的打开和关闭4. 文件的顺序读写4.1 字符/字符串写入(出)4.2 格式化写入(出)4.3 二进制输入&#…...
使用aim7测试内核性能变化
aim7是一个功能强大的性能测试套件,可以用来测试内核的性能变化情况,尤其是在修改内核源码后,用来测试补丁对内核性能的影响情况。aim7测试结果中有一个重要的统计项:jobs/min,即每分钟完成的任务数量,可以…...
C++——内存管理
一,为什么要有内存管理因为在C/C中各个内置类型或者是自定义类型的大小都不一样,而如何让各个类型在内存中合理分布就非常有必要,由此我们就需要有内存管理。我们来看看下面这个程序中的各个变量都是如何分布的int globalVar 1; static int …...
AOP的另类用法 (权限校验自定义注解)
👳我亲爱的各位大佬们好😘😘😘 ♨️本篇文章记录的为 AOP的另类用法 (权限校验&&自定义注解) 相关内容,适合在学Java的小白,帮助新手快速上手,也适合复习中,面试中的大佬🙉🙉…...
[数据结构]:12-快速排序(顺序表指针实现形式)(C语言实现)
目录 前言 已完成内容 快速排序实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-PSeqListFunction.cpp 04-SortCommon.cpp 05-SortFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容,除其中使用到C引用外,全为C语言代…...
运算符——“Python”
各位CSDN的uu们你们好呀,好久没有更新Python文章了,今天,小雅兰的内容就是Python中的操作符啦,那么现在,就让我们进入Python的世界吧 注释 注释是什么 注释的语法 注释的规范 输入输出 和用户交互 通过控制台输出 通…...
2022 IoTDB Summit:华为王超《Apache IoTDB 在华为云的实践》
12 月 3 日、4日,2022 Apache IoTDB 物联网生态大会在线上圆满落幕。大会上发布 Apache IoTDB 的分布式 1.0 版本,并分享 Apache IoTDB 实现的数据管理技术与物联网场景实践案例,深入探讨了 Apache IoTDB 与物联网企业如何共建活跃生态&#…...
C 语言网络编程 — PF_NETLINK sockets
目录 文章目录目录PF_NETLINK socketsPF_NETLINK sockets Linux 提供了 4 种 User Process 和 Kernel 之间进行通信的 IPC(Inter-Process Communicate,进程间通信)方式: /procioctlsysfsPF_NETLINK sockets(Netlink …...
广州银行冲刺A股上市:不良贷款规模突破100亿元,不良率飙升
又一家城商行平移申报IPO。近日,广州银行股份有限公司(下称“广州银行”)递交招股书,准备在深圳证券交易所主板上市。本次冲刺上市,广州银行计划募资约94.79亿元,国泰君安证券为其保荐机构。 截至目前&…...
【C++】bsearch函数的使用及二分法查找介绍
写程序的时候,肯定避免不了需要从集合中找到符合条件的元素,一般情况下,最简单也最常用的就是循环遍历元素,这种方法虽然写的简单,但是小数据量还行,但是数据过大的话,这样效率就低了。循环的时…...
分布式系统中的补偿机制设计问题
我们知道,应用系统在分布式的情况下,在通信时会有着一个显著的问题,即一个业务流程往往需要组合一组服务,且单单一次通信可能会经过 DNS 服务,网卡、交换机、路由器、负载均衡等设备,而这些服务于设备都不一…...
类成员的方法
初识对象 生活中或是程序中,我们都可以使用设计表格、生产表格、填写表格的形式组织数据进行对比,在程序中: 设计表格,称之为:设计类(class) 打印表格,称之为:创建对象 …...
华为OD机试真题Python实现【端口合并】真题+解题思路+代码(20222023)
端口合并 题目 有M(1<=M<=10)个端口组, 每个端口组是长度为N(1<=N<=100)的整数数组, 如果端口组间存在 2 个及以上不同端口相同, 则认为这 2 个端口组互相关联,可以合并 第一行输入端口组个数 M,再输入 M 行,每行逗号分隔,代表端口组。 输出合并后的端口组…...
自考本科计算机网络原理(04741)历年大题真题【18年10月-22年10月】
文章目录一、简答题(历年真题)18年10月-22年10月历年简答题出题情况分析2018年10月2019年4月2019年10月2020年8月2020年10月2021年4月2021年10月2022年4月2022年10月二、综合题(历年真题)2018年10月2019年4月2019年10月2020年8月2…...
计算机SCI期刊投稿,除了投稿信,还要做什么准备? - 易智编译EaseEditing
投稿信的准备 期刊的编辑往往需要一些有关作者及其论文的信息。 而作者也希望给编辑提供一些有助于其全文送审及决策的信息。 这些信息都应该包括在投稿信中。 投稿信应包括以下几方面的内容: 文题和所有作者的姓名;稿件适宜的栏目; 为什么此论文适合于在该刊而…...
Allegro如何刷新封装和库里的封装同步操作指导
Allegro如何刷新封装和库里的封装同步操作指导 在做PCB设计的过程中,有时会因为库里的封装有更新,所以PCB上使用到了这个封装时候需要和库里的同步,如下图 如何刷新,具体操作如下 点击Place点击Update Symbols...
基于Vue3手写选课组件(含时区切换,拖拽选择)
环境说明 基于vue3vite 无关联别的ui框架,组件化 初次使用vue3,技术菜,大佬勿喷 main.ts "moment": "^2.29.4","moment-timezone": "^0.5.41",import moment from moment; import momentTz from &…...
准备好了吗?加入 GDE 成长计划,成为下一位谷歌开发者专家!
谷歌开发者专家 (Google Developer Experts,GDE),又称谷歌开发者专家项目,是由一群经验丰富的技术专家、具有社交影响力的开发者和思想领袖组成的全球性社区。通过在各项活动演讲以及各个平台上发布优质内容来积极助力开发者、企业和技术社区…...
icp备案网站接入信息ip地址段/云南seo
[信息系统安全实验] 实验2.软件安全 格式化字符串漏洞 prog1 prog1.c 代码: /* prog1.c */ #include <stdio.h>void fmtstr() {char input[100];int var 0x11223344; /* print out information for experiment purpose */printf("Target a…...
杭州商城型网站建设/怎么样自己创建网站
在eclipse目录下建个批处理文件eclipse.bat,用文本编辑器打开,写入如下内容:eclipse.exe -vmargs -Xms128m -Xmx512m -XX:PermSize128m -XX:PermSize256m然后保存.以后运行eclipse的时候就执行这个批处理就行了.解释下参数的意思:-vmargs 说…...
云南定制化网站建设/seopeix
题意: 用n个木棒凑成数字,和最大是多少 思路: 直接dp写。 #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> #include<iostream>typedef long long ll; using namespace std; const…...
做网站的常识/高端网站制作
Tomcat 部署项目 本节介绍如何在 Tomcat 上部署服务。 Tomcat 的目录结构 bin:Tomcat 的启动、关闭脚本。conf:Tomcat 配置文件。lib:Tomcat 需要的类库(jar 包)。logs:日志目录。temp:Tomcat…...
佛山网络营销网站/福州网站seo公司
大家自我介绍做的多了,那幽默有个性的自我介绍该怎么写呢?以下是本站小编为大家带来的搞笑自我介绍 3篇,希望能帮助到大家!搞笑自我介绍1大家好!我叫-,有句话说“相聚是缘&r...2020-11-05阅读全文 >>大学生简历中如何自我介绍比较好呢。以下是…...
特种作业操作证查询网站/seo网络推广知识
基于MATLAB--SIMULINK的光伏太阳能电源仿真 电子质量 (2o15第08期)本文就是在第二种方法的基础上 ,进行了改进,利 I(A)用DC—DC斩波器,对实验进行闭环调节 ,最终得 出较为准确的实验结果。 4实验原理如下:先暂时把直流…...