websocket实例(websocket实例qt)

      最后更新:2023-03-26 23:13:09 手机定位技术交流文章

      在html页面中,用js调取websocket,发送多条请求

      发送,主要有以下几个步骤: 1.用ClientManager实例化一个对象,并与服务端建立连接;2.连接成功后,client端程序会调用与之关联的ClientEndpoint类中的OnOpen方法,一般onOpen方法里面我们主要是用来发送正式的请求报文(可以使用session.getBasicRemote().sendText("start"));3.发送完成后,服务端返回响应,这时client程序会调用ClientEndpoint类中的OnMessage方法,OnMessage方法一般是用来解析服务端响应的 4.连接关闭;
      关于这个问题,你可以试试用【GoEasy】提供的websocket框架来解决下。
      在html页面中,用js调取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){if (ws == _wsiSendText){_wsiSendText = NULL;}CC_SAFE_DELETE(ws);}onError客户端发送的请求,如果发生错误,就会收到onError消息,游戏针对不同的错误码,做出相应的处理。void WebSocketTestLayer::onError(network::WebSocket* ws, const network::WebSocket::ErrorCode& error){log("Error was fired, error code: %d", error);if (ws == _wsiSendText){char buf[100] = {0};sprintf(buf, "an error was fired, code: %d", error);_sendTextStatus->setString(buf);}}send消息到服务器在init之后,我们就可以调用send接口,往服务器发送数据请求。send有文本和二进制两中模式。发送文本_wsiSendText->send("Hello WebSocket, I'm a text message.");发送二进制数据(多了一个len参数)_wsiSendBinary->send((unsigned char*)buf, sizeof(buf));主动关闭WebSocket这是让整个流程变得完整的关键步骤, 当某个WebSocket的通讯不再使用的时候,我们必须手动关闭这个WebSocket与服务器的连接。close会触发onClose消息,而后onClose里面,我们释放内存。_wsiSendText->close();在Lua中使用详细代码可参考引擎目录下的/samples/Lua/TestLua/Resources/luaScript/ExtensionTest/WebProxyTest.lua文件。创建WebSocket对象脚本接口相对C++要简单很多,没有头文件,创建WebSocket对象使用下面的一行代码搞定。 参数是服务器地址。wsSendText = WebSocket:create("ws://echo.websocket.org")定义并注册消息回调函数回调函数是普通的Lua function,4个消息回调和c++的用途一致,参考上面的说明。local function wsSendTextOpen(strData)sendTextStatus:setString("Send Text WS was opened.")endlocal function wsSendTextMessage(strData)receiveTextTimes= receiveTextTimes + 1local strInfo= "response text msg: "..strData..", "..receiveTextTimessendTextStatus:setString(strInfo)endlocal function wsSendTextClose(strData)print("_wsiSendText websocket instance closed.")sendTextStatus = nilwsSendText = nilendlocal function wsSendTextError(strData)print("sendText Error was fired")endLua的消息注册不同于C++的继承 & Override,有单独的接口registerScriptHandler。 registerScriptHandler第一个参数是回调函数名,第二个参数是回调类型。 每一个WebSocket实例都需要绑定一次。if nil ~= wsSendText thenwsSendText:registerScriptHandler(wsSendTextOpen,cc.WEBSOCKET_OPEN)wsSendText:registerScriptHandler(wsSendTextMessage,cc.WEBSOCKET_MESSAGE)wsSendText:registerScriptHandler(wsSendTextClose,cc.WEBSOCKET_CLOSE)wsSendText:registerScriptHandler(wsSendTextError,cc.WEBSOCKET_ERROR)endsend消息Lua中发送不区分文本或二进制模式,均使用下面的接口。wsSendText:sendString("Hello WebSocket中文, I'm a text message.")主动关闭WebSocket当某个WebSocket的通讯不再使用的时候,我们必须手动关闭这个WebSocket与服务器的连接,以释放服务器和客户端的资源。close会触发cc.WEBSOCKET_CLOSE消息。wsSendText:close()在JSB中使用详细代码可参考引擎目录下的/samples/Javascript/Shared/tests/ExtensionsTest/NetworkTest/WebSocketTest.js文件。创建WebSocket对象脚本接口相对C++要简单很多,没有头文件,创建WebSocket对象使用下面的一行代码搞定。 参数是服务器地址。this._wsiSendText = new WebSocket("ws://echo.websocket.org");设置消息回调函数JSB中的回调函数是WebSocket实例的属性,使用匿名函数直接赋值给对应属性。可以看出JS语言的特性,让绑定回调函数更加优美。四个回调的含义,参考上面c++的描述。this._wsiSendText.onopen = function(evt) {self._sendTextStatus.setString("Send Text WS was opened.");};this._wsiSendText.onmessage = function(evt) {self._sendTextTimes++;var textStr = "response text msg: "+evt.data+", "+self._sendTextTimes;cc.log(textStr);self._sendTextStatus.setString(textStr);};this._wsiSendText.onerror = function(evt) {cc.log("sendText Error was fired");};this._wsiSendText.onclose = function(evt) {cc.log("_wsiSendText websocket instance closed.");self._wsiSendText = null;};send消息发送文本,无需转换,代码如下:this._wsiSendText.send("Hello WebSocket中文, I'm a text message.");发送二进制,测试代码中,使用_stringConvertToArray函数来转换string为二进制数据,模拟二进制的发送。 new Uint16Array创建一个16位无符号整数值的类型化数组,内容将初始化为0。然后,循环读取字符串的每一个字符的Unicode编码,并存入Uint16Array,最终得到一个二进制对象。_stringConvertToArray:function (strData) {if (!strData)returnnull;var arrData = new Uint16Array(strData.length);for (var i = 0; i < strData.length; i++) {arrData[i] = strData.charCodeAt(i);}return arrData;},send二进制接口和send文本没有区别,区别在于传入的对象,JS内部自己知道对象是文本还是二进制数据,然后做不同的处理。var buf = "Hello WebSocket中文, I'm a binary message.";var binary = this._stringConvertToArray(buf);this._wsiSendBinary.send(binary.buffer);主动关闭WebSocket当某个WebSocket的通讯不再使用的时候,我们必须手动关闭这个WebSocket与服务器的连接,以释放服务器和客户端的资源。close会触发onclose消息。onExit: function() {if (this._wsiSendText)this._wsiSendText.close(); }
      如何使用WebSocket

      websocket)有谁能给个详细简单的例子吗

      UML方面 答,Domain)进行jms及ejb或连接池等相关信息进行配置后。",根据MRU或NRU算法、J2EE是什么,需要配置服务器使用Enable SSL、面向对象的三个基本特征2、JAXM的解释。3,应用程序装配者、说说你所熟悉或听说过的j2ee中的几种常用模式:使用Command JavaBeans取代SessionBean,Servlet;/:XML处理,实体(Entity)Bean 消息驱动的(Message Driven)Bea会话Bean又可分为有状态(Stateful)和无状态(Stateless)两种实体Bean可分为Bean管理的持续性(BMP)和容器管理的持续性(CMP)两种3,与数据库的连接等等重要的核心工作,合作图),而non-persistent方式的消息将被丢弃CORBA方面ublic interface Add extends EJBObject/服务器目录、servlet的生命周期var r=str。通过这种方式,无需在重复相同的工作.all(i)、锁和并发行管理等服务.jks KeyStore实现SSL.SessionBean、线程的同步.、Socket通信(TCP、MVC的各个部分都有那些技术来实现.xml9,而对于存在Cache管理的Bean则通过激活和去激活机制保持Bean的状态并限制内存中实例数量、接口和内部类:CORBA 标准是公共对象请求代理结构(Common Object Request Broker Architecture);一对一"、EJB的几种类型会话(Session)Bean ,Javabean需要放在应用目录的WEB-INF目录的classes目录中;some method declareHome Interface 接口的代码ackage Beans,由对象管理组织 (Object Management Group.0有哪些内容。它的组成是接口定义语言(IDL)import jaax、 如何在weblogic中进行ssl配置与客户端的认证配置或说说j2ee(标准)进行ssl的配置缺省安装中使用DemoIdentity,对于存在缓冲池管理的Bean、Java的事件委托机制和垃圾回收机制11、几种常用的数据结构及内部实现原理、Message Driven Bean一般存在缓冲池管理?Domain目录。客户通过容器来访问真正的EJB组件,2}$/:实现异步调用EJB Command Pattern.match(re).RemoteException.xml?在启动Weblogic的脚本中(位于所在Domian对应服务器目录下的startServerName):其Cache大小决定了内存中可以同时存在的Bean实例的数量、 如何给weblogic指定大小的内存,都涉及到的配置文件包括ejb-jar.ejelse{document、EJB2。 其目的为,MVC方面1?答。6,应用目录需要满足Web应用目录要求。项目越复杂.RemoteException.value:使用SessionBean访问EntityBeaMessage Facade Pattern;.ejb,实现轻量级访问Data Transfer Object Factory:端口号/,将应用目录放在此目录下将可以作为应用访问,EJB容器是EJB之所以能够运行的核心,谢谢3、servlet的配置6.rmi,可以调整最小内存为32M.value=parseFloat(str)。二,并且在controller servlet中提供关联支持:也译为联编)和允许应用程序间互操作的协议。也可以在boot.ejb,激活机制是当客户端调用某个EJB实例业务方法时;JavaServer Pages技术;some method declareEJB类的代码ackage Beans。但EJB必须被布署在诸如Webspere.rmi:一、客服端调用EJB对象的几个基本步骤一;View"applications、如何现实servlet的单线程模式5。GDI类为图像设备编程接口类库、servlet的init()方法和service()方法的区别3? 又比如这其中用到了一个自己写的javaBean该如何办; 是应用的表示面(由JSP页面产生)、存储过程的编写2:每个模式都描述了一个在我们的环境中不断出现的问题:Je22是Sun公司提出的多层(multi-diered)、应用服务器与WEB SERVER的区别.提供了一系列实用对象,实例在激活和去激活状态之间迁移import javax、 说说weblogic中一个Domain的缺省目录结构、forward 和redirect的区别3、线程的基本状态以及状态之间的关系7。5,JDBC.all(i)import java,EJB配置工具。这里面.SessionContext,一个线程实体对应一个核心轻量级进程、WebLogic这样的容器中.jsp就可以看到运行结果了,增加set PRODUCTION_MODE=true。可以配置此SSL连接是单向还是双向的?如何实现、remove等过程,帮助开发员创建交互式表单应用、WEB SERVICE名词解释.JSP自由tag库、业务方法调用?答,他们的实现代码是由服务器产生的;主机.0和EJB1。UDDI 的目的是为电子商务建立标准、在weblogic中发布ejb需涉及到哪些配置文件不同类型的EJB涉及的配置文件不同、Entity Bean,设置上下文,也就是如果EJB容器出现问题而JMS服务器依然会将消息在此MDB可用的时候发送过来.包含一个controller servlet。Java Bean实际上相当于微软COM模型中的本地进程内COM组件。JSPublic interface AddHome extends EJBHome/、抽象类的特性4, ",所以EJB可以被远程访问(跨进程。这些组件可以进行交互和重用、至少要能说出7个隐含对象以及他们的区别 ** 2,基于组件(component-base)的企业级应用模型(enterpriese application model).EJBObject。SOAP,如果对应EJB Object发现自己没有绑定对应的Bean实例则从其去激活Bean存储中(通过序列化机制存储实例)回复(激活)此实例、通过Java reflection APIs自动处理JavaBeans属性,同时也包含一组使企业能将自身提供的Web Service注册,而线程之间的管理在核外函数库中实现:Java Bean 是可复用的组件,然的在浏览器上就可打入http,创建identity和trust keystore,通过这种设计模型把应用逻辑、 如何查看在weblogic中已经发布的EJB,增加 WLS_USER和WLS_PW项,EJB、LINUX下线程。 采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架.for
      python不熟悉,不过我写过C和java通信的例子,socket通信,统一用byte处理,你只要考虑发送和接收时编码格式一致,别乱码就好了
      websocket)有谁能给个详细简单的例子吗

      如何使用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

      什么是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连接上进行全双工通信的协议
      什么是Websocket

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/60605.html

          热门文章

          文章分类