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

nodejs使用koa+websocket实现点对点的即时通讯

首先WebSocket是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议。如果还不了解WebSocket的请移步HTML5WebSocket在以前,我

首先WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。如果还不了解WebSocket的请移步 HTML5 WebSocket

在以前,我们处理点对点通信都只能使用轮询,原因是服务器不能主动向客户端发送信息。有了websocket,使得我们的点对点通信变得了更简单和更加高效。

废话不多说,这届上代码:

服务端app.js

// 使用koa
const koa = require('koa')
const router = require('koa-router')()
// koa-websocket是koa封装好的websocket功能
const websocket = require('koa-websocket')
// 实例化一个ws服务
const app = websocket(new koa())// 用来存储建立了的链接,(真实项目中请使用数据库代替)
let wsObj = {}// 监听koa/ws路由,是否有连接
router.all('/koa/ws', (ctx) => {// 客户端链接传过来的客户端身份const { id } = ctx.query// 将链接保存起来wsObj[id] = ctx;// 给客户端发送链接成功信息ctx.websocket.send('连接成功');// 监听客户端发送过来的信息ctx.websocket.on('message', function(message) {console.log(message);// uid为接收方,将接收到的信息发送给接收方uid,可以根据自己的需求处理数据再发送const uid = JSON.parse(message).uId;if(!wsObj[uid]){ctx.websocket.send(`${uid}未上线`)}else{wsObj[uid].websocket.send(message)}});
})
// 使用路由
app.ws.use(router.routes()).use(router.allowedMethods())//端口号后面可采用动态的
app.listen(3000, () =>console.log('服务启动成功')
)

客户端调用index.js


<html lang&#61;"en"><head><meta charset&#61;"UTF-8"><title>koa-websocket点对点通信title>
head><body><div id&#61;"loginDiv"style&#61;"position: absolute;width:400px;height:200px;left:50%;top:50%;margin-left:-200px;margin-top:-100px;"><div><label for&#61;"nameInput">连接的id(自己的id)label><input type&#61;"text" id&#61;"nameInput" placeholder&#61;"请输入您的ID" /><input type&#61;"button" value&#61;"连接" id&#61;"certainInput" onclick&#61;"ws()" />div><div><label for&#61;"senid">给谁发送label><input type&#61;"text" placeholder&#61;"发送到的id" id&#61;"sendId">div><div><label for&#61;"sendContent">发送的内容label><input type&#61;"text" placeholder&#61;"发送的内容" id&#61;&#39;sendContent&#39;><input type&#61;"button" value&#61;"发送" onclick&#61;"send()">div>div>
body>
<script type&#61;"text/Javascript">var webs &#61; null; // websocket对象var mId &#61; null; // 我的idfunction ws() {mId &#61; document.getElementById(&#39;nameInput&#39;).value;webs &#61; new WebSocket(&#39;ws://localhost:3000/koa/ws?id&#61;&#39; &#43; mId)webs.onopen &#61; function () {console.log(&#39;连接成功&#39;)}// 接收服务器发送的信息webs.onmessage &#61; function (evt) {console.log(evt)}}// 给特定的id发送信息,服务器接收后会向该id发送function send() {var id &#61; document.getElementById(&#39;sendId&#39;).value;var content &#61; document.getElementById(&#39;sendContent&#39;).value;var data &#61; {mId: mId,uId: id,content: content}webs.send(JSON.stringify(data))}script>html>

效果
111用户
在这里插入图片描述
000用户
在这里插入图片描述


推荐阅读
  • vue使用
    关键词: ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 本文介绍了一个Magento模块,其主要功能是实现前台用户利用表单给管理员发送邮件。通过阅读该模块的代码,可以了解到一些有关Magento的细节,例如如何获取系统标签id、如何使用Magento默认的提示信息以及如何使用smtp服务等。文章还提到了安装SMTP Pro插件的方法,并给出了前台页面的代码示例。 ... [详细]
  • <!DOCTYPEhtml><htmllang=en><head><metacharset=UT ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 本文总结了在开发中使用gulp时的一些技巧,包括如何使用gulp.dest自动创建目录、如何使用gulp.src复制具名路径的文件以及保留文件夹路径的方法等。同时介绍了使用base选项和通配符来保留文件夹路径的技巧,并提到了解决带文件夹的复制问题的方法,即使用gulp-flatten插件。 ... [详细]
  • 移动端常用单位——rem的使用方法和注意事项
    本文介绍了移动端常用的单位rem的使用方法和注意事项,包括px、%、em、vw、vh等其他常用单位的比较。同时还介绍了如何通过JS获取视口宽度并动态调整rem的值,以适应不同设备的屏幕大小。此外,还提到了rem目前在移动端的主流地位。 ... [详细]
  • 如何在HTML中获取鼠标的当前位置
    本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • 使用这个技巧要达到的目标:一般来说,模型和控制器你都不会有相同的类名字。让我先创建一个取名为post的model。classPostextendsModel{}现在 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有