1、介绍。
socket是基于TCP的传输层协议,它是实现了浏览器与服务器的双向通讯。在 WebSocket API 中,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。
2、socket的优点。
初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处?

答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客户端发起。

举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP 协议做不到服务器主动向客户端推送信息。

这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用"轮询":每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。

3、socket中emit方法的使用。
emit主要用于端到端发送信息

socket.emit('action');//表示发送了一个action命令,命令是字符串的
//在另一端接收时,可以这么写:
socket.on('action',function(){...});socket.emit('action',data);//表示发送了一个action命令,还有data数据
//在另一端接收时,可以这么写:socket.on('action',function(data){...});socket.emit(action,arg1,arg2); //表示发送了一个action命令,还有两个数据
//在另一端接收时,可以这么写:
socket.on('action',function(arg1,arg2){...});socket.emit(action,arg1,arg2,arg3,arg4); //如果是多个参数,就也应该知道什么意思了,同上

在emit方法中包含回调函数,例如:

socket.emit(‘action’,data, function(arg1,arg2){…} );那么这里面有一个回调函数可以在另一端调用,另一端可以这么写:socket.on(‘action’,function(data,fn){ fn(‘a’,‘b’) ; });

上面的data数据可以有0个或者多个,相应的在另一端改变function中参数的个数即可,function中的参数个数和顺序应该和发送时一致

上面的fn表示另一个端传递过来的参数,是个函数,写fn(‘a’,‘b’) ;会回调函数执行。一次发送不应该写多个回调,否则只有最后一个起效,回调应作为最后一个参数。
4、服务端的信息传输。

// send to current request socket client
socket.emit('message', "this is a test");// sending to all clients except sender
socket.broadcast.emit('message', "this is a test");// sending to all clients in 'game' room(channel) except sender
socket.broadcast.to('game').emit('message', 'nice game');// sending to all clients, include sender
io.sockets.emit('message', "this is a test");// sending to all clients in 'game' room(channel), include sender
io.sockets.in('game').emit('message', 'cool game');// sending to individual socketid
io.sockets.socket(socketid).emit('message', 'for your eyes only');

上述集中方式为socket.io常用的数据传输方式,

io.sockets.on('connection', function (socket) {});

回调函数的socket参数为一个 client 与服务器的连接标示,不同的 client 会有不同的连接标示。
5、不分组数据传输

  • socket.emit
socket.emit 信息传输对象为当前 socket 对应的 client ,各个client socket 相互不影响。
  • socket.broadcast.emit
socket.broadcast.emit 信息传输对象为所有 client ,排除当前socket 对应的 client 。
  • io.sockets.emit
信息传输对象为所有 client 。

6、分组数据传输
类似于之前提过的 of 方法生成命名空间来管理用户, socket.io 可以使用分组方法, socket.join() ,以及与之对应的 socket.leave() 。

io.sockets.on('connection', function (socket) {socket.on('firefox', function (data) {socket.join('firefox');});socket.on('chrome',function(data){socket.join('chrome');});
});

假设有两个聊天室,一个名为firefox,另一个为chrome,客户端操作

socket.emit('firefox') 就可以加入 firefox 聊天室;
socket.emit('chrome') 就可以加入 chrome 聊天室;

向一个分组传输消息,有两种方式:

socket.broadcast.to('chrome').emit('event_name', data);//emit to 'room' except this socket client
io.sockets.in('chrome').emit('event_name', data)//emit to all socket client in the room

broadcast 方法允许当前 socket client 不在该分组内。

可能有一个疑问,一个 socket 是否可以同时存在于几个分组,等效于一个用户会同时在几个聊天室活跃,答案是”可以“, socket.join() 添加进去就可以了。官方提供了订阅模式的示例:

socket.on('subscribe', function(data) { socket.join(data.room);
})socket.on('unsubscribe', function(data) { socket.leave(data.room);})

后台处理订阅/退订事件

socket = io.connect('http://127.0.0.1:1338/');
socket.emit('subscribe',{"room" : "chrome"};
socket.emit('unsubscribe',{"room" : "chrome"};

前端触发订阅/退订事件,就可以加入对应的聊天室。 通过 of 方法也可以通过划分命名空间的方式,实现聊天室功能,但不如分组管理来的方便。

7、Socket.io难点大放送(暂时没有搞定)
授权验证
socket 连接需要添加权限验证,让已登录的用户 socket 连接到服务器,未登录的用户无条件拒绝。全局授权管理如下:

io.sockets.authorization(function (handshakeData, callback) {callback(null, true);
}).

callback 函数有两个参数,第一个为 error ,第二个参数为是否授权bool值,通过授权回调函数应为 callback(null,true) ,其它情况下都为拒绝建立连接。

按照web的开发方式,检测是否登录首选 cookie-session 来实现,问题也是出在这里。 websocket 握手阶段属于 HTTP 协议,简单来说是可以读到cookie,就可以实现session。

  • 精准单用户推送
    理论上来说
// sending to individual socketid
io.sockets.socket(socketid).emit('message', 'for your eyes only');

就可以向一个特定用户推送消息,但是如何获得这个 socketId ,就是生成一个哈希数组,key为username,值为socket.id,这样就可以通过用户名获取对应的id,进而可以向特定client推送消息。

socket的基本使用相关推荐

  1. linux常用c函数(中文版)

    都是linux的c函数东西略多,用页面搜索来查找吧. << Back to man.ChinaUnix.net isalnum(测试字符是否为英文或数字) 相关函数 isalpha,isd ...

  2. 百度前200页部分答案(初稿)

    1操作系统中 heap 和 stack 的区别 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.Java自动管理栈和堆,程序员不能直接地设置栈或堆. 在函数中定义的一些基本类 ...

  3. RPC 笔记(08)— socket 通信(多进程多线程服务器)

    在上一节中如果并行的客户端连接数超过了默认开启进程的数量,那么后来的客户端请求将会阻塞,为了不阻塞新的客户端,我们可以将进程的单线程改成多线程即可. ​ 服务端代码: import json impo ...

  4. RPC 笔记(07)— socket 通信(多进程服务器)

    上节我们完成了一个简单的多线程服务器,可以并发处理多个客户端连接.但是 Python 由于全局解释器锁 GIL 的存在,致使多个线程只能占满一个 CPU 核心,多线程并不能充分利用多核的优势.所以多数 ...

  5. RPC 笔记(06)— socket 通信(多线程服务器)

    1. 客户端代码 import json import time import struct import socketdef send_request(sock_obj, method, param ...

  6. RPC 笔记(05)— socket 通信(单线程服务器)

    1. Python 标准库 1.1 socket 提供 RPC 服务的网络通信功能,方便用户编写 tcp/udp 相关的代码.两个不同机器的进程需要通信时,可以通过 socket 来传输数据. ​ 客 ...

  7. Docker使用遇到问题Got permission denied while trying to connect to the Docker daemon socket解决方案

    Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker. ...

  8. python 网络编程之Socket通信案例消息发送与接收

    背景 网络编程是python编程中的一项基本技术.本文将实现一个简单的Socket通信案例消息发送与接收 正文 在python中的socket编程的大致流程图如上所示 我们来首先编写客户端的代码: # ...

  9. Can 't connect to local MySQL server through socket '/tmp/mysql.sock '(2)

    安装了mysql, 使用命令mysql -u root -p 弹出Can 't connect to local MySQL server through socket '/tmp/mysql.soc ...

  10. C# Socket系列三 socket通信的封包和拆包

    通过系列二 我们已经实现了socket的简单通信 接下来我们测试一下,在时间应用的场景下,我们会快速且大量的传输数据的情况! 1 class Program 2 { 3 static void Mai ...

最新文章

  1. 自定义滚动条Js简版
  2. linux下字符串操作,Linux Bash 中字符串操作
  3. MongoDB via Dotnet Core数据映射详解
  4. 揭秘“21世纪最性感的职业”:数学、编程、沟通和商业技能一个都不能少!...
  5. 1月31日 资源网站(素材模板)
  6. 怎么修改地磅服务器的修改记录,地磅无人值守系统软件怎么修改数据
  7. 为什么我的Linux主机内存用的那么快?
  8. linux内核C -- 第05课:零长度数组
  9. matlab 系统 h10,Thinkbook、ThinkPad出厂带H10混合固态的机器重装系统启用傲腾的方法...
  10. 服务器msdtc没有安全显示项,MSDTC 问题疑难解答 - BizTalk Server | Microsoft Docs
  11. 智慧城市大数据分析系统解决方案
  12. 数据分析-Excel函数练习
  13. 求实数的整数部分和小数部分python_python求实数的整数部分
  14. Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing
  15. 【动量轮自平衡自行车】STM32_PID(开源-含硬件资料)
  16. “GitHub: Your account has been flagged.”的完美解决方法
  17. echarts 修改tooltip字体大小
  18. Web自动化测试02
  19. 高阶ts内置泛型帮助类型
  20. SCU - 4110 - PE class

热门文章

  1. 292 炮兵阵地(状态压缩dp)
  2. openstack 单节点 ubuntu 12.04 server 安装步骤 转自陈沙克老师博客
  3. PS 把两张图片融合为一张
  4. html画布动画,画布动画(Canvas Animation)
  5. 视频中的目标检测与图像中的目标检测具体有什么区别?
  6. 牛客java选择题每日打卡Day9
  7. 47、backtrader的一些基本概念---技术指标(indicator)的使用教程
  8. OEM产品验收测试用例如何编写
  9. android追美剧app,追美剧必备神器!安卓追剧助手App体验
  10. 新浪短网址php源码,新浪短网址api接口腾讯短网址api接口分享