socket的基本使用
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的基本使用相关推荐
- linux常用c函数(中文版)
都是linux的c函数东西略多,用页面搜索来查找吧. << Back to man.ChinaUnix.net isalnum(测试字符是否为英文或数字) 相关函数 isalpha,isd ...
- 百度前200页部分答案(初稿)
1操作系统中 heap 和 stack 的区别 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.Java自动管理栈和堆,程序员不能直接地设置栈或堆. 在函数中定义的一些基本类 ...
- RPC 笔记(08)— socket 通信(多进程多线程服务器)
在上一节中如果并行的客户端连接数超过了默认开启进程的数量,那么后来的客户端请求将会阻塞,为了不阻塞新的客户端,我们可以将进程的单线程改成多线程即可. 服务端代码: import json impo ...
- RPC 笔记(07)— socket 通信(多进程服务器)
上节我们完成了一个简单的多线程服务器,可以并发处理多个客户端连接.但是 Python 由于全局解释器锁 GIL 的存在,致使多个线程只能占满一个 CPU 核心,多线程并不能充分利用多核的优势.所以多数 ...
- RPC 笔记(06)— socket 通信(多线程服务器)
1. 客户端代码 import json import time import struct import socketdef send_request(sock_obj, method, param ...
- RPC 笔记(05)— socket 通信(单线程服务器)
1. Python 标准库 1.1 socket 提供 RPC 服务的网络通信功能,方便用户编写 tcp/udp 相关的代码.两个不同机器的进程需要通信时,可以通过 socket 来传输数据. 客 ...
- 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. ...
- python 网络编程之Socket通信案例消息发送与接收
背景 网络编程是python编程中的一项基本技术.本文将实现一个简单的Socket通信案例消息发送与接收 正文 在python中的socket编程的大致流程图如上所示 我们来首先编写客户端的代码: # ...
- 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 ...
- C# Socket系列三 socket通信的封包和拆包
通过系列二 我们已经实现了socket的简单通信 接下来我们测试一下,在时间应用的场景下,我们会快速且大量的传输数据的情况! 1 class Program 2 { 3 static void Mai ...
最新文章
- 自定义滚动条Js简版
- linux下字符串操作,Linux Bash 中字符串操作
- MongoDB via Dotnet Core数据映射详解
- 揭秘“21世纪最性感的职业”:数学、编程、沟通和商业技能一个都不能少!...
- 1月31日 资源网站(素材模板)
- 怎么修改地磅服务器的修改记录,地磅无人值守系统软件怎么修改数据
- 为什么我的Linux主机内存用的那么快?
- linux内核C -- 第05课:零长度数组
- matlab 系统 h10,Thinkbook、ThinkPad出厂带H10混合固态的机器重装系统启用傲腾的方法...
- 服务器msdtc没有安全显示项,MSDTC 问题疑难解答 - BizTalk Server | Microsoft Docs
- 智慧城市大数据分析系统解决方案
- 数据分析-Excel函数练习
- 求实数的整数部分和小数部分python_python求实数的整数部分
- Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing
- 【动量轮自平衡自行车】STM32_PID(开源-含硬件资料)
- “GitHub: Your account has been flagged.”的完美解决方法
- echarts 修改tooltip字体大小
- Web自动化测试02
- 高阶ts内置泛型帮助类型
- SCU - 4110 - PE class
热门文章
- 292 炮兵阵地(状态压缩dp)
- openstack 单节点 ubuntu 12.04 server 安装步骤 转自陈沙克老师博客
- PS 把两张图片融合为一张
- html画布动画,画布动画(Canvas Animation)
- 视频中的目标检测与图像中的目标检测具体有什么区别?
- 牛客java选择题每日打卡Day9
- 47、backtrader的一些基本概念---技术指标(indicator)的使用教程
- OEM产品验收测试用例如何编写
- android追美剧app,追美剧必备神器!安卓追剧助手App体验
- 新浪短网址php源码,新浪短网址api接口腾讯短网址api接口分享