业务场景

最近有一个业务场景是要做实时语音转义,考虑到实时性,所以决定采用websocket实现。

业务场景是A客户端(手机)进行语音转义的结果实时同步到B客户端(pc),这就需要用到websocket将A转义的结果发送给服务端,服务端接收到A的信息直接同步推送给B,所以它就和简单的无差别广播不同了。

看了网上的websocket示例,很少关于如何针对指定客户端推送消息的,解释的也是错误的。于是决定写一个大家拿去即用的示例。

websocket的通信过程

首先解释下面示例websocket服务的通信过程

1.服务端起一个websocket的端口服务

2.然后客户端去 new WebSocket(服务端地址,如:ws://127.0.0.1:5201/?userId=liubao),此时就走到了服务端的wss.on(‘connection’)建立一个一对一连接了。为了方便大家理解,我把userId直接放url里了(真实业务场景一般是从header里拿token解析用户是谁)

3.服务端就把这个userId的请求连接池储存到clients数组里

4.此时客户端发送一个消息给服务端,就走到了 ws.on(‘message’)里,我们用data去接收客户端发送的消息

备注:从客户端接收到的数据是二进制的buffer信息(二进制信息是传统json信息速度的10倍+),所以在打印data时是个buffer,要想打印出来它的具体信息可以这样

console.log('%s',data);

取data信息时必须先转成字符串,否则是buffer数组信息,无法处理。

我们从客户端发送一个json信息包含userId和要发送的message

example:

// 客户端A
{ "userId": "liubao", "message": "给liubao一个小爱心" }
// 客户端B
{ "userId": "bob", "message": "给你bob一个大铁锤" }

5.有userId时遍历连接池,找到相同的userId连接池,进行推送消息

最后效果

服务端代码

copy下面代码到index.js文件,然后安装依赖和运行

npm i ws
node index.js
import { WebSocketServer } from 'ws';const clients = []; // 与客户端建立的连接池const wss = new WebSocketServer({ port: 5201 }); // 创建一个websocket服务
wss.on('connection', function connection(ws, request, client) {let url = request.headers.origin + request.url; // example:ws://127.0.0.1:5201/?userId=liubaolet userId = getParam(url, 'userId');if (userId) {clients.push({ userId, ws: ws }); // 连接时只要url带userId参数,直接往客户端数组里塞入连接池信息}ws.on('message', function message(data, isBinary) { // 得到客户端往服务端发送的消息try {let objMessage = JSON.parse(`${data}`); // example:{ 'userId': 'liubao', 'message': '给你一个小爱心' }let { userId, message } = objMessage;let count = 0; // 发送客户端数量if (userId) {clients.forEach(e => {if (e['userId'] === userId) {count++;e['ws'].send(`${message}`);}});ws.send(`已发送userId为${userId}的${count}个客户端`);} else {ws.send(JSON.stringify({ error: '请发送指定userId的客户端' }));}} catch (err) {ws.send(JSON.stringify({ error: err.message }));}});ws.on('close', function close(event) {console.log('关闭了');});
});const getParam = (url, param) => new URLSearchParams(new URL(url).search).get(param); // es6获取URL参数方法

websocket给指定客户端推送消息相关推荐

  1. asp服务器推送消息,asp.net实时向客户端推送消息(SignalRWeb)

    [实例简介]ASP.net中服务器端向客户端推送消息,多用于在线聊天 [实例截图] [核心代码] using System; using System.Collections.Generic; usi ...

  2. 服务器向客户端推送消息之——WebSocket详细使用

    文章目录 1. 引言 2. WebSocket使用步骤 2.1 引入依赖 2.2 创建WebSocket配置类 2.3 WebSocket服务类 2.4 前端页面 1. 引言 最近遇到一个生活场景,需 ...

  3. java websocket修改为同步_服务端向客户端推送消息技术之websocket的介绍

    websocket的介绍 在讲解WebSocket前,我们先来看看下面这种场景,在HTTP协议下,怎么实现. 需求: 在网站中,要实现简单的聊天,这种情况怎么实现呢?如下图: ​ 当发送私信的时候,如 ...

  4. SpringBoot 集成 webSocket,实现后台向客户端推送消息

    图文等内容参考链接 SpringBoot2.0集成WebSocket,实现后台向前端推送信息_Moshow郑锴的博客-CSDN博客_springboot websocket WebSocket 简介 ...

  5. php 通知客户端,PHP+SSE服务器向客户端推送消息

    SSE与WebSocket作用相似,都是建立浏览器与服务器之间的通信渠道,然后服务器向浏览器推送信息. 但是WebSocket比SSE强大很多,SSE只能作为一个轻量级的消息推送方案,解决了从服务端向 ...

  6. DWR实现服务器端向客户端推送消息

    2019独角兽企业重金招聘Python工程师标准>>> 1.简介 DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框 ...

  7. worker服务器推送消息,关于Worker如何向指定Client推送消息

    use Workerman\Worker; require_once './Workerman/Autoloader.php'; // 初始化一个worker容器,监听1234端口 $worker = ...

  8. JAVA调用易信接口向指定好友推送消息(一)背景需求

    众所周知,中国电信内部一直使用易信群进行交流 各种工作交流都在易信群里面沟通 包括投诉处理,障碍报修,拍照上传 最重要的就是每天甚至每个时点的指标完成情况的通报 所以只能用4个字来形容 String ...

  9. Servlet→DWR实现JAVA服务器端向客户端推送消息

    DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架

最新文章

  1. 全局声明宏定义_Rust语言:元编程,强大的宏系统,菜鸟到高手进阶的必经之路...
  2. elastic job review
  3. 没钱还装逼,买二手车的都是什么人?
  4. 使用RequestHandlerRetryAdvice重试Web服务操作
  5. 5种SpringBoot热部署方式,你用哪种?
  6. android bitmap 替换指定颜色,Android 实现把bitmap图片的某一部分的颜色改成其他颜色...
  7. org.hibernate.hql.ast.QuerySyntaxException: myaddressbook is not mapped
  8. 一文了解机器学习以及其相关领域(下)
  9. c#:无限极树形结构
  10. 云服务器显示502错误,云服务器出现502错误怎么办
  11. 笔记本锁定计算机功能键,笔记本键盘锁定键在哪_笔记本电脑的“键盘锁”是哪一个键-win7之家...
  12. github提交时报错:remote: Support for password authentication was removed on August 13, 2021问题解决方案
  13. Codeforces Round #645 (Div. 2)
  14. 负整数及浮点数的二进制表示
  15. Google Earth Engine(GEE)批量下载不透水面数据
  16. 模式识别 | PRML概览
  17. C++11 auto关键字的用法
  18. 谷歌浏览器怎么同步收藏夹,书签云帮助你
  19. 【C语言】C语言从入门到精通|第1章 C语言概述—自学笔记
  20. Android画各种圆,饼图,环图,圆形图片

热门文章

  1. ServiceComb 课程
  2. JAVA如何开发订单通知短信
  3. Python - 体脂率
  4. DC(Design Compiler)使用说明
  5. 关于技嘉雷电扩展卡SSDT驱动教程
  6. 统计学习导论 - 基于R的应用 学习笔记1
  7. iOS中UIColor,CGColor,CIColor详解
  8. php 实现每日持续签到,累计签到,送积分
  9. 在MATLAB环境下使用深度学习网络DeepLabV3+进行语义分割(云图分割)
  10. 如何让spyder中途暂停(之前运行出来的结果仍然显示)