如何使用WebSocket
WebSocket的出现是基于Web应用的实时性需要而产生的。这种实时的Web应用大家应该不陌生,在生活中都应该用到过,比如新浪微博的评论、私信的通知,腾讯的WebQQ等。让我们来回顾下实时 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 /chat HTTP/1.1Host: server.example.comUpgrade: websocketConnection: UpgradeSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==Origin:http://example.comSec-WebSocket-Protocol: chat, superchatSec-WebSocket-Version: 13从服务器到客户端的内容:代码如下复制代码HTTP/1.1 101 Switching ProtocolsUpgrade: 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来简单调用即可,而服务器端是要自己实现的,服务器端将在下个博文来讲。代码如下复制代码WebSocket JavaScript 接口定义:[Constructor(in DOMString url, optional in DOMString protocol)]interface WebSocket {readonly attribute DOMString URL;// ready stateconst unsigned short CONNECTING = 0;const unsigned short OPEN = 1;const unsigned short CLOSED = 2;readonly attribute unsigned short readyState;readonly attribute unsigned long bufferedAmount;// networkingattribute Function onopen;attribute Function onmessage;attribute Function onclose;boolean send(in DOMString data);void close();};WebSocket implements EventTarget;简单了解下接口方法和属性:readyState表示连接有四种状态:CONNECTING (0):表示还没建立连接;OPEN (1): 已经建立连接,可以进行通讯;CLOSING (2):通过关闭握手,正在关闭连接;CLOSED (3):连接已经关闭或无法打开;url是代表 WebSocket 服务器的网络地址,协议通常是”ws”或“wss(加密通信)”,send 方法就是发送数据到服务器端;close 方法就是关闭连接;onopen连接建立,即握手成功触发的事件;onmessage收到服务器消息时触发的事件;onerror异常触发的事件;onclose关闭连接触发的事件;JavaScript调用浏览器接口实例如下:代码如下复制代码var wsServer = 'ws://localhost:8888/Demo'; //服务器地址var websocket = new WebSocket(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) {//产生异常 };

websocket重连不创建新对象
可以。我创建了一个新的Web应用程序,该应用程序使用WebSocket连接到Node.JS WebSocket服务器。现在,节点服务器可以完成所需的所有工作,并且可以完美运行。 在我的实例中,我实质上创建了一个对象,该对象包装了WebSocket,然后通过调用connect(使用setInterval重新连接 url ),这将创建另一个WebSocket实例。

如何使用WebSocket
这里WebSocketServer对象通过Setup方式对要侦听的IP及端口进行了设置。然后使用Start方法启动侦听。 Setup方法有4种重载,但是我们通常用到的只有设置IP和端口,IP为string类型,如果传入的字符串无法被转换为支持的IP格式,Setup方法会返回false表示设置失败。WebSocketServer还提供了4个事件用以管理与客户端的连接、断开、和接受消息动作。新版本的WebSocket支持传送的数据格式有 “文本” 和 “二进制”两种,NewMessageReceived事件用于处理文本类型的消息,NewDataReceived事件用于处理二进制类型的消息。到这里 我们已经成功的搭建了一个实现了WebSocket协议的服务端了。至于服务端的寄宿方式有很多,SuperWebSocket框架支持以 控制台、Winform、IIS以及Windows服务的形式寄宿服务,不过网上很多资料都不建议在IIS中寄宿服务,据说是因为寄宿在IIS中性能比较低。WebSocket既然是双工通信,那么我们就不能光等着接收来自客户端的消息, 我们也需要从服务端向客户端“推送”消息,现在我们来看如何由服务端向客户端发送消息。SuperWebSocket框架中,服务端与客户端创建的连接对象为WebSocketSession类型,也就是说它将每一个客户端的实例视为一个会话,在客户端创建连接的时候,产生这个会话,在客户端断开连接的时候,销毁这个会话,而客户端与服务端进行消息通信的时候,也依赖这个会话进行传递。我们要实现服务器端向客户端的广播,就要获取到当前正在活动的所有会话,我们通过代码来看如何获取所有的会话wsServer.Getwww.hbbz08.comAllSessions() //获取所有的会话 已断开的会话不会出现在集合中很简单吧,在获取到活动的会话之后 我们就可以向客户端发送消息了,这里我们让服务器向客户端定时发送服务器时间复制代码Timer timer = new Timer((data) =>{var msg = string.Format("服务器当前时间:{0:HH:MM:ss}", DateTime.Now);//对当前已连接的所有会话进行广播foreach (var session in wsServer.GetAllSessions()){session.Send(msg);}}, null, 1000, 1000);复制代码这样 所有与服务端保持连接的客户端就都可以接受到来自服务器端的消息了。在这个例子里 我们看到了所有的消息都是由会话对象发出的,会话对象Send的消息 也支持“文本”与“二进制两种形式,同时会话对象还提供一个SendCloseHandshakeResponse()方法向客户端发送一个强制断开连接的指令。WebSocketSession对象包含了服务端和客户端的所有信息,以及WebSocketServer对象本身,我们可以利用它做很多事情,下边我们就来实现一个简单的聊天室。至于聊天室的原理 就是一个人将要说的话发送到服务器,再由服务器广播给在这个聊天室里的所有人看到。恩 就这么简单。我们来上代码,多了不解释,相当简单。View Code 关与SuperWebSocket的基本使用就介绍到这里了……顶着老板不时窥屏的压力,可能文章有点语无伦次,希望大家多多体谅,也希望大家提出宝贵意见 共同学习。下一篇我会考虑介绍“子协议”和SuperWebSocket提供的Json字符串类型数据的处理
这里WebSocketServer对象通过Setup方式对要侦听的IP及端口进行了设置。然后使用Start方法

什么是Websocket
认识HTML5的WebSocket 在HTML5规范中,我最喜欢的Web技术就是正迅速变得流行的WebSocket API。WebSocket提供了一个受欢迎的技术,以替代我们过去几年一直在用的Ajax技术。这个新的API提供了一个方法,从客户端使用简单的语法有效地推动消息到服务器。让我们看一看HTML5的WebSocket API:它可用于客户端、服务器端。而且有一个优秀的第三方API,名为Socket.IO。一、什么是WebSocket API?WebSocket API是下一代客户端-服务器的异步通信方法。该通信取代了单个的TCP套接字,使用ws或wss协议,可用于任意的客户端和服务器程序。WebSocket目前由W3C进行标准化。WebSocket已经受到Firefox 4、Chrome 4、Opera 10.70以及Safari 5等浏览器的支持。WebSocket API最伟大之处在于服务器和客户端可以在给定的时间范围内的任意时刻,相互推送信息。WebSocket并不限于以Ajax(或XHR)方式通信,因为Ajax技术需要客户端发起请求,而WebSocket服务器和客户端可以彼此相互推送信息;XHR受到域的限制,而WebSocket允许跨域通信。Ajax技术很聪明的一点是没有设计要使用的方式。WebSocket为指定目标创建,用于双向推送消息。二、WebSocket API的用法只专注于客户端的API,因为每个服务器端语言有自己的API。下面的代码片段是打开一个连接,为连接创建事件监听器,断开连接,消息时间,发送消息返回到服务器,关闭连接。[Copy to clipboard] [ - ]CODE:// 创建一个Socket实例var socket = new WebSocket('ws://localhost:8080');// 打开Socketsocket.onopen = function(event) {// 发送一个初始化消息socket.send('I am the client and I'm listening!');// 监听消息socket.onmessage = function(event) {console.log('Client received a message',event);};// 监听Socket的关闭socket.onclose = function(event) {console.log('Client notified socket has closed',event);};// 关闭Socket....//socket.close()};让我们来看看上面的初始化片段。参数为URL,ws表示WebSocket协议。onopen、onclose和onmessage方法把事件连接到Socket实例上。每个方法都提供了一个事件,以表示Socket的状态。onmessage事件提供了一个data属性,它可以包含消息的Body部分。消息的Body部分必须是一个字符串,可以进行序列化/反序列化操作,以便传递更多的数据。WebSocket的语法非常简单,使用WebSockets是难以置信的容易……除非客户端不支持WebSocket。IE浏览器目前不支持WebSocket通信。如果你的客户端不支持WebSocket通信,下面有几个后备方案供你使用:Flash技术 —— Flash可以提供一个简单的替换。 使用Flash最明显的缺点是并非所有客户端都安装了Flash,而且某些客户端,如iPhone/iPad,不支持Flash。AJAX Long-Polling技术 —— 用AJAX的long-polling来模拟WebSocket在业界已经有一段时间了。它是一个可行的技术,但它不能优化发送的信息。也就是说,它是一个解决方案,但不是最佳的技术方案。由于目前的IE等浏览器不支持WebSocket,要提供WebSocket的事件处理、返回传输、在服务器端使用一个统一的API,那么该怎么办呢?幸运的是,Guillermo Rauch创建了一个Socket.IO技术。三、带Socket.IO的WebSocketSocket.IO是Guillermo Rauch创建的WebSocket API,Guillermo Rauch是LearnBoost公司的首席技术官以及LearnBoost实验室的首席科学家。Socket.IO使用检测功能来判断是否建立WebSocket连接,或者是AJAX long-polling连接,或Flash等。可快速创建实时的应用程序。Socket.IO还提供了一个NodeJS API,它看起来非常像客户端API。建立客户端Socket.IOSocket.IO可以从GitHub下载,可以把socket.io.js文件包含到页面中:[Copy to clipboard] [ - ]CODE:[/code此时,Socket.IO在此页面上是有效的,是时候创建Socket了:[code]// 创建Socket.IO实例,建立连接var socket= new io.Socket('localhost',{port: 8080});socket.connect();// 添加一个连接监听器socket.on('connect',function() {console.log('Client has connected to the server!');});// 添加一个连接监听器socket.on('message',function(data) {console.log('Received a message from the server!',data);});// 添加一个关闭连接的监听器socket.on('disconnect',function() {console.log('The client has disconnected!');});// 通过Socket发送一条消息到服务器function sendMessageToServer(message) {socket.send(message);}Socket.IO简化了WebSocket API,统一了返回运输的API。传输包括:WebSocketFlash SocketAJAX long-pollingAJAX multipart streamingIFrameJSONP polling你还可以设置任意的Socket.IO构造器的第二个选项,选项包括:port - 待连接的端口transports - 一个数组,包含不同的传输类型transportOptions - 传输的参数使用的对象,带附加属性Socket.IO还提供了由本地WebSocket API提供的普通连接、断开连接、消息事件。Socket还提供了封装每个事件类型的方法。四、NodeJS和Socket.IO联合开发Socket.IO提供的服务器端解决方案,允许统一的客户端和服务器端的API。使用Node,你可以创建一个典型的HTTP服务器,然后把服务器的实例传递到Socket.IO。从这里,你创建连接、断开连接、建立消息监听器,跟在客户端一样。一个简单的服务器端脚本看起来如下:[Copy to clipboard] [ - ]CODE:// 需要HTTP 模块来启动服务器和Socket.IOvar http= require('http'), io= require('socket.io');// 在8080端口启动服务器var server= http.createServer(function(req, res){// 发送HTML的headers和messageres.writeHead(200,{ 'Content-Type': 'text/html' });res.end('
Hello Socket Lover!
');});server.listen(8080);// 创建一个Socket.IO实例,把它传递给服务器var socket= io.listen(server);// 添加一个连接监听器socket.on('connection', function(client){// 成功!现在开始监听接收到的消息client.on('message',function(event){console.log('Received message from client!',event);});client.on('disconnect',function(){clearInterval(interval);console.log('Server has disconnected');});});你可以运行服务器部分,假定已安装了NodeJS,从命令行执行:[Copy to clipboard] [ - ]CODE:node socket-server.js现在客户端和服务器都能来回推送消息了!在NodeJS脚本内,可以使用简单的JavaScript创建一个定期消息发送器:[Copy to clipboard] [ - ]CODE:// 创建一个定期(每5秒)发送消息到客户端的发送器var interval= setInterval(function() {client.send('This is a message from the server! ' + new Date().getTime());},5000);服务器端将会每5秒推送消息到客户端!五、dojox.Socket和Socket.IOPersevere的创建者Kris Zyp创建了dojox.Socket。dojox.Socket以Dojo库一致的方式封装了WebSocket API,用于在客户端不支持WebSocket时,使用long-polling替代。下面是怎样在客户端使用dojox.Socket和在服务器端使用Socket.IO的例子:[Copy to clipboard] [ - ]CODE:var args, ws= typeof WebSocket!= 'undefined';var socket= dojox.socket(args= {url: ws? '/socket.io/websocket' : '/socket.io/xhr-polling',headers:{'Content-Type':'application/x-www-urlencoded'},transport: function(args, message){args.content = message; // use URL-encoding to send the message instead of a raw bodydojo.xhrPost(args);};});var sessionId;socket.on('message', function(){if (!sessionId){sessionId= message;args.url += '/' + sessionId;}else if(message.substr(0, 3) == '~h~'){// a heartbeat}});dojox.socket.Reconnect还创建了在套接字失去连接时自动重连。期待包含dojox.Socket的Dojo 1.6版本早日发布。六、实际应用和WebSocket资源有很多WebSocke的实际应用。WebSocket对于大多数客户机-服务器的异步通信是理想的,在浏览器内聊天是最突出的应用。WebSocket由于其高效率,被大多数公司所使用。WebSocket资源Socket.IO站点:http://socket.io/WebSocket的Wikipedia:http://en.wikipedia.org/wiki/WebSocketsWebSockets.org站点:http://www.websockets.org/Dojo WebSocket站点:http://www.sitepen.com/blog/2010/10/31/dojo-websocket/
WebSocket:在单个TCP连接上进行全双工通信的协议

在html页面中,用js调取websocket,发送多条请求
发送,主要有以下几个步骤: 1.用ClientManager实例化一个对象,并与服务端建立连接;2.连接成功后,client端程序会调用与之关联的ClientEndpoint类中的OnOpen方法,一般onOpen方法里面我们主要是用来发送正式的请求报文(可以使用session.getBasicRemote().sendText("start"));3.发送完成后,服务端返回响应,这时client程序会调用ClientEndpoint类中的OnMessage方法,OnMessage方法一般是用来解析服务端响应的 4.连接关闭;
关于这个问题,你可以试试用【GoEasy】提供的websocket框架来解决下。

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