WebSocket入门及使用指南
在浏览器与服务器通信间,传统的 HTTP 请求在某些场景下并不理想,比如实时聊天、实时性的小游戏等等, 其面临主要两个缺点:其基于 HTTP 的主要解决方案有:可以看到,基于 HTTP 协议的方案都包含一个本质缺陷 —— 「被动性」,服务端无法下推消息,仅能由客户端发起请求不断询问是否有新的消息,同时对于客户端与服务端都存在性能消耗。WebSocket 是 HTML5 中提出的新的网络协议标准,其包含几个特点:在浏览器中使用 Websocket 非常简单,在支持 Websocket 的浏览器中会提供了原生的 WebSocekt 对象,其中对于消息的接收与数据帧处理在浏览器中已经封装好了。以下将用一个简单的例子解释如何使用 WebSocekt;浏览器中提供了原生类 WebSocket ,使用 new 关键字实例化它:接收两个参数:WebSocket 类提供了一些常量表示连接状态:实例化对象中可以监听到以下事件:首先触发 open 事件,之后每次发送数据服务端都会回复数据,因此触发了 message 事件,如果触发 close 事件;这里最后一次发送之后未收到服务端回复也是因为客户端立即断开了连接;websocket.send()是发送信息方法对 WebSocket 实例监听事件有两种方式,这里以 message 事件为例:在 message 回调函数中得到 MessageEvent 类型参数 e ,我们需要的数据可以通过 e.data 获取;需要注意的一点是:不论服务端与客户端,其接受到的数据都是序列化后的字符串(当然也有 ArrayBuffer|Blob 类型数据),很多时候我们需要解析处理数据,比如JSON.parse(e.data) ;由于网络环境复杂,某些情况会出现断开连接或者连接出错,需要我们在 close 或者 error 事件中监听非正常断开并重连;由于一些原因在 error 时浏览器并不会响应回调事件,因此稳妥的做法还需要在 open 之后开启一个定时任务去判断当前的连接状态 readyState ,在出现异常情况下尝试重连;websocket规范定义了心跳机制,一方可以通过发送ping(opcode 0x9)消息给另一方,另一方收到ping后应该尽可能快的返回pong(0xA)。心跳机制是用于检测连接的对方在线状态,因此如果没有心跳,那么无法判断一方还在连接状态中,一些网络层比如 nginx 或者浏览器层会主动断开连接,在 JavaScript 中,WebSocket 并没有开放 ping/pong 的 API ,虽然浏览器自带了心跳处理,然而不同厂商的实现也不尽相同,因此需要在我们开发时候与服务端约定好一个自实现的心跳机制;比如浏览器中,检测到 open 事件后,启动一个定时任务,每次发送数据 0x9 给服务端,而服务端返回 0xA 作为响应;实践下来,心跳的定时任务一般是相隔 15-20 秒发送一次。前文说到,Websocket 是建立与 TCP 之上,那么其与 HTTP 协议有和关系呢?Websocket 连接分为建连阶段与连接阶段,在建立连接阶段借助于 HTTP ,而在连接阶段则与 HTTP 无关。从浏览器的 Network 中,找到 ws 连接,可以看到:这是一个标准的 HTTP 请求,相比于我们常见的 HTTP 请求协议,请求头中多了几个字段:重点请求首部意义如下:响应头中:可以看到其返回状态码为 101 ,表示切换协议;Upgrade 与 Connection 用于回复客户端表示已经切换协议成功;Sec-WebSocket-Accept 字段与 Sec-WebSocket-Key 相对应,用于验证服务的正确性;当通过 HTTP 建立连接握手后,接下来则是真正的 Websocket 连接了,其基于 TCP 收发数据,Websocket 封装并开放接口。在 HTTP 协议中,很多时候为了加密与安全需要使用 HTTPS 请求(HTTP + TCL);相应的,在 Websocket 协议中,也是可以使用加密传输的 —— wss ,比如wss://localhost:8080 。使用的也是与 HTTPS 一样的证书,在这里一般是交由 Nginx 等服务层去做证书处理。本文参考文章:https://qiutc.me/post/websocket-guide.html

怎样自定义并使用websocket子协议
由于Websocket协议提供的是一个基于包的可靠传输协议,它并不像HTTP那样是个应用协议,它的包对内容并不像HTTP那样有Content-Type字段去描述,是一个比较底层的协议,就和TCP一样,如果要用来通信通常需要自己来定一个协议。那么subprotocol就可以作为一个标示来让服务端和客户端之间进行协商用。 客户端在进行连接的时候可以声明自己能接受的子协议类型。这和HTTP请求头里带的Accept和Accept-Encoding头字段一样,说明自己可以接受那些类型文件,或者编码,通常是压缩类型Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Encoding:gzip, deflate, sdchHTTP的请求里带的这样,向server端说明它能理解哪些类型的数据。 然后和HTTP一样,Server会根据合适的头来返回相应的内容。 然后客户单就知道怎么样去解释响应的数据了。
WebSocket协议是一种网络协议,它实现了浏览器与服务器的双向通讯的设计。
websocket的子协议,定义的时候 var sock = new WebSocket(url,subportocol);第一个参数表示要请求的地址URL,第二个参数(可选的,如果不写就默认是空字符串)字符串或者字符串组成的数组,每个字符串就是一个子协议。服务器返回响应客户端子协议才能建立连接,否则握手失败。如服务端告诉客户端使用str1协议建立连接:请求:Sec-WebSocket-Protocol:str1,str2Sec-WebSocket-Version:13Upgrade:websocket响应:Connection:UpgradeSec-WebSocket-Accept:lWc5qBYvZLWjFVzUOegIyRDnSG0=Sec-Websocket-Protocol:str1 Upgrade:websocket

WebSocket 的实现
长连接:一个链接上可以连续发送多个数据包,在链接期间,如果没有数据包发送,需要双方发链路检查包TCP/IP:TCP/IP 属于传输层,主要解决网络中的数据传输问题,只管传输数据。但这样对传输的数据没有一个规范的封装、解析等处理。使得传输的数据难以识别,所以才有了应用层协议对数据进行的封装、解析等,如http协议。HTTP:HTTP协议是应用层协议,用于分装解析传输数据。 从HTTP1.1开始其实就默认开启了长链接,也就是请求头header中可以看到Connection:Keep-alive。但是长连接只是说保持了(服务器可以告诉客户端保持时间Keep-Alive:timeout=20;max=20;)这个TCP通道,并采用服务器和客户端应答模式(Request-Response),不需要再创建一个链接通道,做到一个性能优化。socket:与HTTP协议不一样,socket不是协议,他是在程序层面上对传输层协议(像TCP/IP)的接口封装。我们知道传输层的协议,是解决数据在网络中传输的问题的,那么socket(套接字)就是传输通道两端的接口。Websocket:WebSocket是包装成了一个应用层协议作为socket,从而能够让客户端和远程服务端通过web建立全双工通信。WebSocket API 是HTML5 推出的东西。在客户端我们可以通过HTML5 所提供的API 对websocket 进行创建、发送数据、监听信息、监听报错等功能( HTML5 WebSocket )我们知道WebSocket 是在Socket的基础上实现的,所以我们要做的是对现有的Socket协议进行升级。步骤:客户端发送websocket请求-->服务端接受并识别该请求-->对该请求协议进行升级--> 返回给客户端 --> websocket 通道建立 --> 客户端/服务端发送数据协议升级在这里需要注意的是头部信息和头部信息中的Sec-Websocket-Accept的值。该值需要是一个通过base64加密的哈希值(sha1)。 而该加密所用的数据是客户端传过来的sec-websocket-key的值和MAGIC_STRINC内的固定值。对MAGIC_STRINC的说明Webscoket 中传输的数据是数据帧(frame)数据帧有多种类型 主要有:文本型、二进制数据数据帧结构每一列代表一个字节,一个字节8位,每一位又代表一个二进制数。创建数据帧解数据帧心跳检查由于websocket 不进行交互会关闭通道所以,才有了心跳检查。websocket与和他http的区别基于node实现websocket协议使用nodeJS在HTTP上实现WebSocket如何让我的服务器返回正确的Sec-WebSocket-Accept标头值学习WebSocket协议—从顶层到底层的实现原理websocket 协议帧 解析nodejs实现Websocket的数据接收发送

如何使用WebSocket
WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。 Cocos2d-x引擎集成libwebsockets,并在libwebsockets的客户端API基础上封装了一层易用的接口,使得引擎在C++, JS, Lua层都能方便的使用WebSocket来进行游戏网络通讯。引擎支持最新的WebSocket Version 13。在C++中使用详细代码可参考引擎目录下的/samples/Cpp/TestCpp/Classes/ExtensionsTest/NetworkTest/WebSocketTest.cpp文件。头文件中的准备工作首先需要include WebSocket的头文件。#include "network/WebSocket.h"cocos2d::network::WebSocket::Delegate定义了使用WebScocket需要监听的回调通知接口。使用WebSocket的类,需要public继承这个Delegate。class WebSocketTestLayer : public cocos2d::Layer, public cocos2d::network::WebSocket::Delegate并Override下面的4个接口:virtual void onOpen(cocos2d::network::WebSocket* ws);virtual void onMessage(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::Data& data);virtual void onClose(cocos2d::network::WebSocket* ws);virtual void onError(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::ErrorCode& error);后面我们再详细介绍每个回调接口的含义。新建WebSocket并初始化WebSocket.org 提供了一个专门用来测试WebSocket的服务器"ws://echo.websocket.org"。 测试代码以链接这个服务器为例,展示如何在Cocos2d-x中使用WebSocket。新建一个WebSocket:cocos2d::network::WebSocket* _wsiSendText = new network::WebSocket();init第一个参数是delegate,设置为this,第二个参数是服务器地址。 URL中的"ws://"标识是WebSocket协议,加密的WebSocket为"wss://"._wsiSendText->init(*this, "ws://echo.websocket.org")WebSocket消息监听在调用send发送消息之前,先来看下4个消息回调。onOpeninit会触发WebSocket链接服务器,如果成功,WebSocket就会调用onOpen,告诉调用者,客户端到服务器的通讯链路已经成功建立,可以收发消息了。void WebSocketTestLayer::onOpen(network::WebSocket* ws){if (ws == _wsiSendText){_sendTextStatus->setString("Send Text WS was opened.");}}onMessagenetwork::WebSocket::Data对象存储客户端接收到的数据, isBinary属性用来判断数据是二进制还是文本,len说明数据长度,bytes指向数据。void WebSocketTestLayer::onMessage(network::WebSocket* ws, const network::WebSocket::Data& data){if (!data.isBinary){_sendTextTimes++;char times[100] = {0};sprintf(times, "%d", _sendTextTimes);std::string textStr = std::string("response text msg: ")+data.bytes+", "+times;log("%s", textStr.c_str());_sendTextStatus->setString(textStr.c_str());}}onClose不管是服务器主动还是被动关闭了WebSocket,客户端将收到这个请求后,需要释放WebSocket内存,并养成良好的习惯:置空指针。 void WebSocketTestLayer::onClose(network::WebSocket* ws)

ios 怎么实现websocket 怎么监听心跳
/以下为设置长连接的请求头,以及请求头里面包含的数据 NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];[request addValue:info1.myToken forHTTPHeaderField:@"token"];[request addValue:info1.imid forHTTPHeaderField:@"imid"];[request addValue:@"hoho" forHTTPHeaderField:@"circleCode"];[request addValue:app_build forHTTPHeaderField:@"build"];[request addValue:app_version forHTTPHeaderField:@"version"];[request addValue:@"ios" forHTTPHeaderField:@"osType"];NSString * str = @"open"; NSData *data = [str dataUsingEn

本文由 在线网速测试 整理编辑,转载请注明出处。