浏览器websocket是否能连接C++的socket

如题所述

WebSocket的出现是基于Web应用的实时性需要而产生的。这种实时的Web应用大家应该不陌生,在生活中都应该用到过,比如新浪微博的评论、私信的通知,腾讯的Web 等。让我们来回顾下实时Web应用的窘境吧。在WebSocket出现之前,一般通过两种方式来实现Web实时用:轮询机制和流技术;其中轮询有不同的轮询,还有一种叫Comet的长轮询。轮询:这是最早的一种实现实时Web应用的方案。客户端以一定的时间间隔向服务端发出请求,以频繁请求的方式来保持客户端和服务器端的同步。这种同步方案的缺点是,当客户端以固定频率向服务器发起请求的时候,服务器端的数据可能并没有更新,这样会带来很多无谓的网络传输,所以这是一种非常低效的实时方案。长轮询:是对定时轮询的改进和提高,目地是为了降低无效的网络传输。当服务器端没有数据更新的时候,连接会保持一段时间周期直到数据或状态改变或者时间过期,通过这种机制来减少无效的客户端和服务器间的交互。当然,如果服务端的数据变更非常频繁的话,这种机制和定时轮询比较起来没有本质上的性能的提高。流:常就是在客户端的页面使用一个隐藏的窗口向服务端发出一个长连接的请求。服务器端接到这个请求后作出回应并不断更新连接状态以保证客户端和服务器端的连接不过期。通过这种机制可以将服务器端的信息源源不断地推向客户端。这种机制在用户体验上有一点问题,需要针对不同的浏览器设计不同的方案来改进用户体验,同时这种机制在并发比较大的情况下,对服务器端的资源是一个极大的考验。上述方式其实并不是真正的实时技术,只是使用了一种技巧来实现的模拟实时。在每次客户端和服务器端交互的时候都是一次HTTP的请求和应答的过程,而每一次的HTTP请求和应答都带有完整的HTTP头信息,这就增加了每次传输的数据量。但这些方式最痛苦的是开发人员,因为不论客户端还是服务器端的实现都很复杂,为了模拟比较真实的实时效果,开发人员往往需要构造两个HTTP连接来模拟客户端和服务器之间的双向通讯,一个连接用来处理客户端到服务器端的数据传输,一个连接用来处理服务器端到客户端的数据传输,这不可避免地增加了编程实现的复杂度,也增加了服务器端的负载,制约了应用系统的扩展性。基于上述弊端,实现Web实时应用的技术出现了,WebSocket通过浏览器提供的API真正实现了具备像C/S架构下的桌面系统的实时通讯能力。其原理是使用JavaScript调用浏览器的API发出一个WebSocket请求至服务器,经过一次握手,和服务器建立了TCP通讯,因为它本质上是一个TCP连接,所以数据传输的稳定性强和数据传输量比较小。WebSocket协议WebSocket协议本质上是一个基于TCP的协议。为了建立一个WebSocket连接,客户端浏览器首先要向服务器发起一个HTTP请求,这个请求和通常的HTTP请求不同,包含了一些附加头信息,其中附加头信息”Upgrade:WebSocket”表明这是一个申请协议升级的HTTP请求,服务器端解析这些附加的头信息然后产生应答信息返回给客户端,客户端和服务器端的WebSocket连接就建立起来了,双方就可以通过这个连接通道自由的传递信息,并且这个连接会持续存在直到客户端或者服务器端的某一方主动的关闭连接。下面我们来详细介绍一下WebSocket协议,由于这个协议目前还是处于草案阶段,版本的变化比较快,我们选择目前最新的draft-ietf-hybi-thewebsocketprotocol-17版本来描述WebSocket协议。因为这个版本目前在一些主流的浏览器上比如Chrome,、FireFox、Opera上都得到比较好的支持。通过描述可以看到握手协议客户端发到服务器的内容:代码如下复制代码GET/chatHTTP/1.1Host:server.example.comUpgrade:websocketConnection:UpgradeSec-WebSocket-Key:dGhlIHNhbXBsZSBub25jZQ==Origin:Sec-WebSocket-Protocol:chat,superchatSec-WebSocket-Version:13从服务器到客户端的内容:代码如下复制代码HTTP/1.1101SwitchingProtocolsUpgrade:websocketConnection:UpgradeSec-WebSocket-Accept:s3pPLMBiTxaQ9kYGzzhZRbK+xOo=Sec-WebSocket-Protocol:chat这些请求和通常的HTTP请求很相似,但是其中有些内容是和WebSocket协议密切相关的。我们需要简单介绍一下这些请求和应答信息,”Upgrade:WebSocket”表示这是一个特殊的HTTP请求,请求的目的就是要将客户端和服务器端的通讯协议从HTTP协议升级到WebSocket协议。其中客户端的Sec-WebSocket-Key和服务器端的Sec-WebSocket-Accept就是重要的握手认证信息了,这些内容将在服务器端实现的博文中讲解。相信通过上文的讲解你应该对WebSocket有了个初步认识了,如果有任何疑问欢迎交流。客户端如概念篇中介绍的握手协议,客户端是由浏览器提供了API,所以只要使用JavaScript来简单调用即可,而服务器端是要自己实现的,服务器端将在下个博文来讲。代码如下复制代码WebSocketJavaScript接口定义:[Constructor(inDOMStringurl,optionalinDOMStringprotocol)]interfaceWebSocket{readonlyattributeDOMStringURL;//readystateconstunsignedshortCONNECTING=0;constunsignedshortOPEN=1;constunsignedshortCLOSED=2;readonlyattributeunsignedshortreadyState;readonlyattributeunsignedlongbufferedAmount;//networkingattributeFunctiononopen;attributeFunctiononmessage;attributeFunctiononclose;booleansend(inDOMStringdata);voidclose();};WebSocketimplementsEventTarget;简单了解下接口方法和属性:readyState表示连接有四种状态:CONNECTING(0):表示还没建立连接;OPEN(1):已经建立连接,可以进行通讯;CLOSING(2):通过关闭握手,正在关闭连接;CLOSED(3):连接已经关闭或无法打开;url是代表WebSocket服务器的网络地址,协议通常是”ws”或“wss(加密通信)”,send方法就是发送数据到服务器端;close方法就是关闭连接;onopen连接建立,即握手成功触发的事件;onmessage收到服务器消息时触发的事件;onerror异常触发的事件;onclose关闭连接触发的事件;JavaScript调用浏览器接口实例如下:代码如下复制代码varwsServer='ws://localhost:8888/Demo';//服务器地址varwebsocket=newWebSocket(wsServer);//创建WebSocket对象websocket.send("hello");//向服务器发送消息alert(websocket.readyState);//查看websocket当前状态websocket.onopen=function(evt){//已经建立连接};websocket.onclose=function(evt){//已经关闭连接};websocket.onmessage=function(evt){//收到服务器消息,使用evt.data提取};websocket.onerror=function(evt){//产生异常};
温馨提示:答案为网友推荐,仅供参考