最近学习了一下socket.io,不太会用,所以做了一个小demo理一下思路。

主要目的是实现向某个指定的用户发送消息,也就是服务端单独推送信息给某个人。具体的思路就是每个在线的用户都对应一个socket对象,可以通过socket.id获取其唯一的id。通过该对象(toSocket)与链接到这个对象的客户端进行单独通信。

socket.io服务端代码

var app = require('http').createServer(handler);
var io = require('socket.io')(app);
var fs = require('fs');
var _ = require('underscore');
// 监听端口
app.listen(3000);
var hashName = new Array();function handler(req, res) {fs.readFile(__dirname + '/index.html',function (err, data) {res.writeHead(200);res.end(data);});
}// 通过 emit 和 on 可以实现服务器与客户端之间的双向通信// io.sockets.on('connection', function (socket) { ... }) 的作用是服务器监听所有客户端 并返回该新连接对象
// 这个事件在在客户端与服务器建立链接时自动触发
io.on('connection', function (socket) {console.log('新加入一个连接。');// 不管是服务器还是客户端都有 emit 和 on 这两个函数,socket.io 的核心就是这两个函数socket.on('setRoom', function (data) {console.log(data);var name = data.roomId;// // 储存上线的用户hashName[name] = socket.id;});/*** on :用来监听一个 emit 发送的事件* 'sayTo' 为要监听的事件名* 匿名函数用来接收对方发来的数据* 这个匿名函数的第一个参数为接收的数据,如果有第二个参数,则是要返回的函数。*/socket.on('sayTo', function (data) {var toName = data.to;var toId = data.id;if (toId = hashName[toName]) {// nodejs的underscore扩展中的findWhere方法,可以在对象集合中,通过对象的属性值找到该对象并返回。var toSocket = _.findWhere(io.sockets.sockets, {id: toId});// socket.emit() :向建立该连接的客户端广播// socket.broadcast.emit() :向除去建立该连接的客户端的所有客户端广播// io.sockets.emit() :向所有客户端广播,等同于上面两个的和// 通过该连接对象(toSocket)与链接到这个对象的客户端进行单独通信toSocket.emit('message', data.msg);}});// 当关闭连接后触发 disconnect 事件socket.on('disconnect', function () {console.log('断开一个连接。');});
});

index.html代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>socket.io演示客户端</title><script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.1.1/socket.io.js"></script>
</head>
<body>
<h1>socket.io演示客户端</h1>
<input type="text" placeholder="设置房间号" id="roomId"><button>确定</button>
<input type="text" placeholder="发送消息" id="msg">
<input type="text" placeholder="发送给" id="toRoomId"><button id="sayTo">确定</button>
<div id="word"></div>
</body>
<script>$=function (id) {return document.getElementById(id);};var socket = io.connect('127.0.0.1:3000');var setRoom = document.getElementsByTagName("button")[0],sayTo = document.getElementsByTagName("button")[1],msg = $("msg"),word = $("word"),toRoom=$("toRoomId");setRoom.onclick=function(){socket.emit('setRoom',{"roomId":$("roomId").value}) ;};sayTo.onclick=function () {var toMsg=msg.value;socket.emit("sayTo",{"to":toRoom.value,"msg":toMsg});};// 当收到对方发来的数据后触发 message 事件socket.on('message',function (data) {word.innerHTML+="<p>"+data+"</p>";});
</script>
</html>

重要的部分都加了注释,写的不太好,还需要继续学习!

简单的nodejs+socket.io给指定的人发送消息相关推荐

  1. 利用Python实现微信定时为指定的人发送消息(新手)

    生活中有时我们需要在特定时间点给别人发送消息时,而又有其他的事情需要处理,很容易造成我们遗忘掉这件事,这是我们就需要一个程序来帮助我们来执行这一任务,经过几天在网上的查询 写了一个小程序,希望各位大神 ...

  2. Nodejs+socket.io 搭建个人的网页聊天室

    Nodejs+socket.io 搭建个人的网页聊天室 最近看到别人搭建了自己的实时聊天室便产生了兴趣,于是乎自己也着手搭建了一个.在socket这里我选用了socket.io这个模块,在网上看了很多 ...

  3. 【博客大赛】100行js代码实现网站在线用户数量统计 nodejs + socket.io方案

    需求提出 公司的在线培训平台,需要增加一个新功能:实时统计当前在线的用户数量并在终端界面上显示,需要的时候可以查询当前在线的用户的明细. 有3种技术方案可以选用: 1)改动后台代码,在用户登录和退出时 ...

  4. Qt Remote Object(QtRO)给指定的客户端发送消息

    概述 前面写了两篇文章介绍QtRO的使用方法,在这里: Qt Remote Object(QtRO)实现进程间通信 Qt Remote Object(QtRO)动态Replica实现进程间通信 然后会 ...

  5. kafka集群部署成功后,创建生产者往指定主题里面发送消息时出错

    问题描述:kafka集群部署成功后,创建生产者往指定主题里面发送消息时出错,如下所示: 解决方法:在kafka的server.properties配置文件中需要打开listenners配置行,不要使用 ...

  6. python微信定时发消息_python实现给微信指定好友定时发送消息

    微信如何在设定时间自动发送信息给指定好友 微信没有定时发送信息的功能,但是可以借助小程序. 世界上最遥远的距离,不是生与死,而是小编就站在你面前,你却不知道小编爱你. 打开微信之后在搜索小程序中输入蜗 ...

  7. php 公众号指定人发消息,微信公众号客服接口给指定用户openid发送消息

    微信公众号客服接口给指定用户openid发送消息 2018-09-23 微信开发文档: 客服接口-发消息 接口调用请求说明 http请求方式: POSThttps://api.weixin.qq.co ...

  8. Node.js Websocket给指定的人发送信息

    如果要给指定的人发送信息,在websocket里面就要用到socketIdxos来作为一个识别每个连接用户的"id" socketIdxos可以是字符串,也可以是数字,一般是在一个 ...

  9. Nodejs+socket.io搭建WebRTC信令服务器

    前言 我们在学习 WebRTC 时,首先要把实验环境搭建好,这样我们就可以在上面做各种实验了. 对于 WebRTC 来说,它有一整套规范,如使它使用的接口.使用SDP进行媒体协商.通过ICE收集地址并 ...

最新文章

  1. mysql 织梦 索引_Mysql索引详解 建立索引的优势劣势以及索引规范
  2. contains java_Java CopyOnWriteArraySet contains()用法及代码示例
  3. linux_NandFlash_driver_超详细分析 .
  4. php只显示指定文件类型_PHP 上传时的文件类型
  5. oracle未获得监听器,无监听文件listener.ora的动态监听小例试验
  6. 【云笔记搭建】Visual Code + Github仓库 + Git
  7. Spring ORM+Hibernate?Out!换 Spring Data JPA 吧!
  8. java九九成表发_用EXCEL可多种办法生成99乘法表
  9. server2008r2经常蓝屏或者自动重启
  10. C++ string构造函数和析构函数
  11. linux oracle ojdbc,Maven无法下载Oracle驱动ojdbc的解决方式
  12. OSS 下载文件名乱码
  13. fc安卓模拟器_【经典手机回顾】索尼爱立信Xperia Play:最早的安卓游戏手机
  14. java 校验d盘是否存在_从零学java笔录-第2篇 验证jdk是否安装成功
  15. python加载图片的方法_python实现读取并显示图片的两种方法
  16. 局域网简易聊天服务器&客户端
  17. Matplotlib进阶教程:布局讲解
  18. JQuery弹幕发送
  19. 基于RESTful的FastAPI服务模板
  20. Word编辑招聘文档教学

热门文章

  1. 最新韩小韩二次元高清图库api开源PHP网站源码
  2. BufferedImage 图片打水印
  3. html设置长宽高代码_html设置高等于宽
  4. 玩乐|杭州夏季纳凉好去处
  5. 白话微服务60秒:从快餐店点餐看事件驱动架构
  6. 网关末尾要么是1要么是254
  7. 支持一对多脱机克隆,ORICO发布三款便携式硬盘对拷机 - 超能网
  8. 基于主轴变换的医学图像倾斜校正
  9. 【互联网代理方案】——Zookeeper
  10. 苹果11怎样设置自动锁屏 iPhone11自动锁屏操作方法