websocket实现聊天室(一)

2023-11-12

        最近接到一个聊天室的任务,之前在学校完全没有接触过这方面的需求,在网上查找资料后,基本确定了实现方案,现在就开始着手学习,在此记录一下遇到的问题。

初识websocket

        在简单了解websocket后,我觉得与http请求类似,不过websocket可以实现在客服端向服务器发一次请求之后,就会建立一个不会中断的通讯,这样实现聊天室就不需要像http请求那样,你需要隔一段时间就向服务器发一次请求,询问是否有发给我的消息。

H5中使用websocket

        H5中提供了websocket的API,我们可以直接使用。

主要就是四部曲:

1、创建websocket(这里有一个问题,我参考资料中websocket服务地址使用的是ws://echo.websocket.org,但我使用的时候报了个错,貌似是被拦截器拦截了,没有找到解决办法,所以直接使用的自己本地创建的websocket的服务地址,本篇后面也会介绍如何创建一个简单的本地的websocket服务)

  // 1、创建websocket
      // 参数:websocket的服务地址
      var socket = new WebSocket("ws://localhost:3000");

2、注册一个open事件,在连接创建时触发的事件

// 2、open:当和websocket的服务器连接成功时触发
      socket.addEventListener("open", () => {
        // 将服务器连接成功的信息打印到div中
        div.innerHTML = "服务器连接成功了!";
      });

3、注册一个send事件,发送数据给服务器

// 3、 send:发送数据给服务器
      button.addEventListener("click", () => {
        // 获取输入框中的数据
        var value = input.value;
        // 调用send方法将数据发送给服务器
        socket.send(value);
      });

4、注册一个message事件,接收服务器数据

// 4、message:接收服务器数据
      socket.addEventListener("message", (e) => {
        // 将接收到的数据显示出来
        div.innerHTML = e.data;
      });

        这样客户端(浏览器)简单的流程就走完了,接下来就是搭建一个本地的websocket服务。

搭建一个本地的websocket服务

         这里我是用的方式是用nodejs-websocket进行搭建,使用说明文档地址: ddwsnodejs-websocket - npm

按照官方的教程进行搭建就可以。

1、首先我们需要安装nodejs-websocket的依赖

npm install nodejs-websocket

2、创建一个server.js,引入nodejs-websocket包

// 1、 导入nodejs-websocket包
const ws = require("nodejs-WebSocket");

3、创建一个server

// 创建一个server
const server = ws.createServer((conn) => {
    console.log("有用户连接上来了!");
    // 接收到客户端发送的数据时触发
    conn.on("text", (data) => {
      broadcast(data);
    });
    // 连接断开时触发
    conn.on("close", (data) => {
      broadcast(data);
    });
    // 异常时触发
    conn.on("error", (data) => {
      console.log("发生异常!");
    });
  }).listen(PORT, () => {
    console.log("websocket服务器动起来了!监听了端口:" + PORT);
  });

        这里有一个需要注意的地方,注册close事件时,也需要将error事件注册,因为发生close事件时,会发生异常,若没有注册error事件,服务器就会停止运行。

4、将接收到的数据发送给所有人(广播)

// 广播方法
function broadcast(msg) {
  server.connections.forEach((item) => {
    item.send(JSON.stringify(msg));
  });
}

 这样一个简单的websocket服务器就搭建完成了。

下面把两个完整的代码贴出来

index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>

    <style>
      div {
        width: 200px;
        height: 400px;
        border: 1px solid;
      }
    </style>
  </head>
  <body>
    <!-- 显示内容 -->
    <div></div>
    <!-- 输入内容 -->
    <input type="text" placeholder="请输入要发送的内容" />
    <!-- 发送按钮 -->
    <button>发送</button>

    <script>
      var input = document.querySelector("input");
      var button = document.querySelector("button");
      var div = document.querySelector("div");

      // 1、创建websocket
      // 参数:websocket的服务地址
      var socket = new WebSocket("ws://localhost:3000");
      // 2、open:当和websocket的服务器连接成功时触发
      socket.addEventListener("open", () => {
        div.innerHTML = "服务器连接成功了!";
      });
      // 3、 send:发送数据给服务器
      button.addEventListener("click", () => {
        var value = input.value;
        socket.send(value);
        console.log(value);
      });
      // 4、message:接收服务器数据
      socket.addEventListener("message", (e) => {
        div.innerHTML = JSON.parse(e.data);
      });
    </script>
  </body>
</html>

server.js

 

// 1、 导入nodejs-websocket包
const ws = require("nodejs-WebSocket");
const PORT = 3000;

let count = 0;
// 创建一个server
const server = ws
  .createServer((conn) => {
    console.log("有用户连接上来了!");
    count++;
    conn.userName = "用户" + count;

    broadcast(conn.userName + "进入了聊天室");

    // 接收到客户端发送的数据时触发
    conn.on("text", (data) => {
      broadcast(data);
    });
    // 连接断开时触发
    conn.on("close", (data) => {
      count--;
      broadcast(data);
    });
    // 异常时触发
    conn.on("error", (data) => {
      console.log("发生异常!");
    });
  })
  .listen(PORT, () => {
    console.log("websocket服务器动起来了!监听了端口:" + PORT);
  });

// 广播方法
function broadcast(msg) {
  server.connections.forEach((item) => {
    item.send(JSON.stringify(msg));
  });
}

运行

        命令提示符进入到server.js的目录下,node .\server.js,然后打开index.html即可

         这篇只是完成了一个最简单的聊天室功能,聊天历史记录、区分消息类型、定位到最新一条消息、发送图片表情等都没有实现,接下来就是按着微信聊天对功能进行优化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

websocket实现聊天室(一) 的相关文章

  • WebSocket 连接到 TIdHTTPServer,握手问题

    我正在使用 C Builder 10 1 Berlin 编写一个简单的 WebSocket 服务器应用程序 该应用程序在端口上侦听从 Web 浏览器 例如 Google Chrome 发送的一些命令 在我的表单上 我有一个 TMemo TB
  • Websocket 在客户端返回 500,在服务器返回 101

    我们尝试使用 nginx ingress 控制器在 Kubernetes 集群上实现 WebSocket 入口 yaml apiVersion extensions v1beta1 kind Ingress metadata annotat
  • 跨浏览器选项卡共享 websocket?

    我们希望每个浏览器都有一个套接字 而不是浏览器中的每个选项卡都有一个套接字 我们怎样才能实现它呢 我读到了有关共享网络工作者的文章 这很有前途 对此的参考也值得赞赏 不幸的是 据我所知 共享网络工作者尚未被 Mozilla 或 Intern
  • Elastic Beanstalk 剥离 Sec-WebSocket-Accept 标头

    我正在尝试让 NET Core 应用程序在 elastic beanstalk 上运行 以从浏览器中的 javascript 接收 websockets 连接 当我在本地计算机上测试 AWS 之外的客户端和服务器时 我能够在两者之间建立 W
  • Python 的 SignalR 替代方案

    Python 世界中 SignalR 的替代方案是什么 准确地说 我在Windows 8上使用tornado和python 2 7 6 我发现sockjs龙卷风 https github com MrJoes sockjs tornado
  • NodeJS Websocket如何在服务器重新启动时重新连接

    在 Node js 中我使用网络套接字 ws https github com websockets ws用于 WebSocket 连接 以下是客户端的代码 假设我们正在连接的服务器套接字宕机了一分钟 close 事件将会触发 但是每当服务
  • 使用来自 WebSocket @ServerEndpoint 的 CDI @SessionScoped bean

    在 Web 应用程序中 用户使用 servlet HTTP 会话 一些数据存储在 CDI SessionScoped beans 中 稍后在某些页面中 WebSocket 通信是在用户浏览器和服务器之间执行的 对于 GlassFish 4
  • WebSocket 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 Linux 上使用 C 访问 WebSocket API 我见过不同的图书馆 比如libweb
  • Play框架2.5.0 Websockets示例[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 播放框架 2 5 0 Websockets 示例 在 play 2 5 0 websockets 代码
  • 通过nodejs服务器+socket.io从mp3文件同步流式传输音乐

    我的服务器上有一个 mp3 文件 我希望所有访问该网址的客户都能同步收听该音乐 That is 假设该文件播放 6 分钟 我在上午 10 00 开始播放这首歌 上午 10 03 发出的请求应从歌曲的第 3 分钟开始收听 我所有的客户都应该同
  • Websockets:npm 中的 Rachet 和 autobahn 兼容吗?

    我正在尝试Ratchet PHP 库 http socketo me 特别是 我一直在尝试整合他们的推式整合 http socketo me docs push演示到 React 应用程序中 他们的演示参考看似一次性的 autobahn J
  • Websocket-rails 不适用于 Nginx 和 Unicorn 的生产环境

    我有 Rails 3 2 应用程序和 gem websocket rails 0 7 在开发机器上 一切正常 在生产环境中 我使用 Nginx 1 6 作为代理服务器 使用 Unicorn 作为 http 服务器 Thin 用于独立模式 如
  • 与 Socket.io 保持连接

    我正在尝试使用 asterisk websocket 连接socket io 客户端 https github com socketio socket io client socket io connect url transports w
  • WebSocket 和负载平衡是瓶颈吗?

    当有一堆充当 WebSocket 无人机的系统和这些无人机前面的负载均衡器时 当 WebSocket 请求进入 LB 时 它会选择一个 WebSocket 无人机 并建立 WebSocket 我在 ELB 上使用 AWS ELB tcp S
  • 使用 WebSocket 是否会产生服务器成本?

    我已经离开了 PHP MySQL 的舒适区 因为语法 封装 过程的东西可能会让人沮丧 上周 我开始尝试并按照一些教程使用 Node js Socket IO 创建实时聊天应用程序 到目前为止 我从未使用过 WebSockets 做过任何事情
  • C# SignalR 异常 - 连接在收到调用结果之前开始重新连接

    我正在开发 2 个应用程序 第一个是 C 控制台应用程序 另一个是 Asp net Web 应用程序 我正在使用 SignalR 连接两者 这是我的 C 控制台应用程序 客户端 public class RoboHub public sta
  • Websocket java 客户端 Spring + Stomp:传输错误:ConnectionLostException

    我正在尝试使用 Stomp 和 Sockjs 创建一个独立的 Java 应用程序作为今年 Spring 的 websocket 客户端 考虑到 spring 规范和 spring portafolio 示例 我收到此错误 15 18 01
  • Jetty、websocket、java.lang.RuntimeException:无法加载平台配置器

    我尝试在 Endpoint 中获取 http 会话 我遵循了这个建议https stackoverflow com a 17994303 https stackoverflow com a 17994303 这就是我这样做的原因 publi
  • 使用 HTML5 或 Javascript 的 P2P 视频会议

    我正在尝试使用 html5 和 javascript 构建视频会议 直到现在我能够流式传输我的相机捕获并将其显示在画布上 这是代码
  • WebSocket 和 Origin 标头字段

    以下引用自 RFC6455 WebSocket 协议 不打算处理来自任何网页的输入但 仅对于某些站点应验证 Origin 场是原点 他们期望 如果服务器不接受指示的来源 那么它应该用回复来响应 WebSocket 握手 包含 HTTP 40

随机推荐

  • Unity界面插件NGUI核心组件说明

    UICamera 可以添加到任何相机 包含事件系统 UICamera是每个UI的重要组成部分 它负责发送Camera中所有NGUI的活动 如果场景中仅有一个Camera 要确保它附有UICamera脚本 如果有多个相机 确保至少用来渲染UI
  • Elasticsearch 7 插件

    1 elasticsearch head 可视化插件 通过浏览器就能看到es的集群部署 节点 索引等信息 注意 es在5 x版本就不再支持head插件安装了 百度搜索可以有多种方式安装 我这里用的是谷歌浏览器安装es head的扩展程序 如
  • 读《携程异步消息系统实践》之总结

    读 携程异步消息系统实践 之总结 消息系统 批量 insertOnly 索引 消息投递 Partition Stick 写入事件截获 预期 Long polling 集群管理 Lease
  • Markdown 有序列表、无序列表中插入代码块

    问题描述 在列表中插入代码块 代码块总是顶格的 并且导致代码块之后的文本也是顶格的 也就是代码块的插入导致了列表的结束 如下所示 解决方法 代码块上方空出来一行 代码块左侧加8个空格或2个TAB 每一行都加 预期效果 扩展 本人个人网站上采
  • 基于Qt仿QQ效果实现图片查看器(支持查看GIF)

    主要提供两个类 第一个类显示静态图片 第二个类显示动态图片 两个类都包含图片缩小放大以及图片移动功能 最后自己封装一个类 根据判断图片是动态还是静态去调用对应的类显示图片 效果展示 判断图片类型 int showImage getImage
  • Mac系统安装Myeclipse2015CI出现虚拟内存为0的问题

    出处 http bbs feng com read htm tid 8450072 page 2 html 方法1 你可以按照9楼的朋友的方法 开启虚拟机的情况下 再安装Myeclipse 就不会出现虚拟内存为0的提示 方法2 Downlo
  • 一元二元三元表达式_2020年高考复习不等式专题训练2.三元不等式的证明

    三元不等式是二元不等式的补充形式 三元不等式和二元不等式类似 经常会有一个三元等式作为条件 解决三元不等式问题的思路大致分为两种 第一是根据等式条件减少未知量的数量 将三元转化为二元 第二是直接利用二元基本不等式的扩展形式或者将三元两两组合
  • Qt中click事件如何响应带参槽函数

    include qttest008 h include
  • Android LCD(一):LCD基本原理篇

    关键词 android LCD TFT 液晶 偏光片 彩色滤光片 背光 平台信息 内核 linux2 6 linux3 0系统 android android4 0 平台 samsung exynos 4210 exynos 4412 ex
  • PHP分页页面重复,WordPress分页标题重复如何解决

    WordPress是一款非常流行的博客程序 虽然它各方面的优化都做的不错了 但每个人的喜好都不一样 一些细节还是可以改进的 No牛网就碰到Wordpress很多的问题都不是那么好实现 毕竟不是专门做CMS的 如等下要说到的Wordpress
  • 【C++】STL库set容器

    STL库set容器 1 构造函数 2 增 2 1 insert 去重 排序 2 2 emplace 去重 排序 2 3 代码演示 3 删 3 1 erase 函数 3 1 1 erase list与vector 3 1 2 erase ma
  • 【python基础知识】20.“午饭吃什么”的python实现(产品思维-实操篇)

    文章目录 前言 练习介绍 练习目标 练习要求 项目实操 明确目标 形成技术方案 编写程序代码 数据准备 主流程逻辑搭建 完善补充确实的功能 最终代码整合 总结 前言 首先 我们回顾以下运用学到的编程知识去做一个产品的大致步骤 同时 也学了一
  • 使配置的环境变量生效

    在dos窗口中输入 set PATH C 之后 关闭该窗口 再次打开窗口 输入 echo PATH 可见配置的环境变量已经生效
  • c#中代码中多线程动态创建progressbar的实例,概念很重要可扩展很多类似概念

    以下是代码中创建progressbar的实例 int count 0 private void button4 Click object sender EventArgs e Thread th new Thread gt Form for
  • Markdown笔记:写数学公式方法

    Markdown笔记 写数学公式方法 这里简单记录一下在markdown中书写数学公式的方法 就像Stackoverflow上的经常有的挺漂亮的公式 其生成的不是图片 而MathJax引擎 在Markdown中添加MathJax引擎也很简单
  • vue项目如何运行(超详图解)

    vue项目如何运行 超详图解 1 查看node npm版本 打开cmd 输入npm v 查看npm版本 输入node v 查看node版本 若出现类似下图显示 即为安装成功 2 删除删除package lock json和node modu
  • 什么是Qt信号槽机制

    1 信号和槽概述 信号槽是 Qt 框架引以为豪的机制之一 所谓信号槽 实际就是观察者模式 发布 订阅模式 当某个 事件 发生之后 比如 按钮检测到自己被点击了一下 它就会发出一个信号 signal 这种发出是没有目的的 类似广播 如果有对象
  • React Hooks--与传统react写法比较

    React Hooks 简介 2018年底FaceBook的React小组推出Hooks以来 所有的React的开发者都对它大为赞赏 React Hooks就是用函数的形式代替原来的继承类的形式 并且使用预函数的形式管理state 有Hoo
  • oracle按照首汉字首字母排序

    按照拼音顺序 ORDER BY nlssort NAME NLS SORT SCHINESE PINYIN M 按照部首顺序 ORDER BY nlssort NAME NLS SORT SCHINESE RADICAL M 按照笔画顺序
  • websocket实现聊天室(一)

    最近接到一个聊天室的任务 之前在学校完全没有接触过这方面的需求 在网上查找资料后 基本确定了实现方案 现在就开始着手学习 在此记录一下遇到的问题 初识websocket 在简单了解websocket后 我觉得与http请求类似 不过webs