导航:首页 > 编程语言 > cwebsocket编程

cwebsocket编程

发布时间:2022-09-19 04:04:06

A. c++ websocketpp 怎么用

首先:在我们是要使用C++搭配现有的函数库来开发的,所以不太适合使用一般的网站服务器方案;而在稍微评估了一下后,后来是决定使用“WebSocket++”这个函数库,来做为C++环境的WebSocket Server开发方案。
WebSocket++的官方网站是:http://www.zaphoyd.com/websocketpp,他是采用BSD License的OpenSource、跨平台函数库,文件则都放在Github上(网页)。他目前最新的版本是0.3.x,在Github上要切换到“experimental”这个brahch;而这个版本的WebSocket++基本上是使用C++11以及Boost C++ Libraries里的ASIO(官网)来实作的Header -Only的函数库,所以在使用前不需要特别去建置这个函数库、只要在需要时去include他的Header档就可以了,相当地方便。
然后在WebSocket 的功能方面,他除了有提供Server 端的功能外,也可以用来开发Client 端的程序,算是相当地完整;虽然他的板号还在0.3,好像还很新,不过实际上功能应该算是够用了~
1.文件准备
如果要使用WebSocket++ 的话,基本上就是先到GitHub 上0.3.x 这个分支:https://github.com/zaphoyd/websocketpp/tree/experimental去把文件下载下来。而下载下来的文件里面,“websocketpp”这个文件夹,就是要使用这个函数库时,所有需要的文件了~而文件的部分,则是要连到他的网页(链结)去看,内容不算很完整,Heresy算是看着范例程序和原始码写出来的;这点算是Heresy觉得这个函数库做的比较差一点的地方,不过考虑到现在还是0.3版,也就不要要求太多了。
另外,由于他是基于Boost ASIO来开发网络的功能,所以也必须要下载Boost C++ Libraries来使用;Boost的官方网站是:http://www.boost.org/。
而如果有需要用到TLS的加密连线的话,应该是会需要使用OpenSSL这个函数库(官网);如果不打算做加密连线的话,基本上是可以跳过这个函数库的。(Heresy没试过这部分)
2.基本概念
WebSocket++的基本使用说明,可以参考《Building a program with WebSocket++》这份文件。Heresy这边算是整理一下,自己玩过后的想法。
首先,要使用WebSocket++ 来开发程序的时候,基本上要include 两种文件,一种是用来做组态设置(config)的,一种则是用来决定要开发的程序的脚色类型(Role)的。
Role
在Role 的部分,主要就是分成Server 和Client 两种;Server 就是用来开发WebSocket 服务器的,而Client 则是可以用来开发C++ 的WebSocket 的用户端程序、连线到其他的??WebSocket Server 做数据的存取。
如果要建立Server 端的程序的话,就是要include server 用的header 档:
#include <websocketpp/server.hpp>
而之后则是就可以建立出websocketpp::server<>的物件,拿来做操作。
如果是要建立Client 端程序的话,则是要include client 的header 档:
#include <websocketpp/client.hpp>
之后则是建立出websocketpp::client<>的物件来做连线。
而WebSocket++的server或client这两种类别,都是template的class,在建立时也需要指定要使用的config才可以。
Config
Config 的部分,WebSocket++ 主要提供了三种类型:
config::core
config::asio
config::asio_tls
上面这三种类型,在WebSocket++是不同的结构,,config::core基本上是提供有限功能的设置,相对的他只会用到C++11的功能。而config::asio则是使用Boost ASIO做基础来提供完整的功能;config::asio_tls则是config::asio再加上TLS的连线加密功能。
而根据组合的不同,不同的config也需要include websocketpp/config的目录下、不同的header档:

Server
Client
core
core.hpp
core_client.hpp
asio
asio_no_tls.hpp
asio_no_tls_client.hpp
asio_tls
asio.hpp
asio_client.hpp
而如果是以要建立一个使用Boost ASIO、没有TLS加密的Server的话,基本上就是要include
asio_no_tls.hpp
#include <websocketpp/config/asio_no_tls.hpp>
其他的组合,也可以依此类顶。
Endpoint
在决定要include 哪两个文件后,接下来就可以在程序里面,建立出需要使用的WebSocket++ 物件了。
如果是要建立使用Boost ASIO、没有TLS 加密的Server 的话,基本上要include 的文件就是:
#include <websocketpp/server.hpp>
#include <websocketpp/config/asio_no_tls.hpp>
而在控制用的物件的部分,则就是:
websocketpp:: server <websocketpp::config:: asio > mServer;
之后,所有的功能就都是针对mServer这个物件进行操作。而在WebSocket++里面,则是把它称为“endpoint”;通过组合出不同的endpoint,就可以实作不同的功能了。
Server 的范例
基本上,因为Heresy的目的是要建立一个WebSocket Server让网页来连线,所以这边就只讲Server的部分了~而实际上,在《Building a program with WebSocket++》里,官方就有提供一个很简单的使用范例了~他的源代码如下:
#include <iostream>

#include <websocketpp/config/asio_no_tls.hpp>
#include <websocketpp/server.hpp>

typedef websocketpp:: server <websocketpp::config:: asio > server ;
void on_message(websocketpp:: connection_hdl hdl , server :: message_ptr msg )
{
std::cout << msg ->get_payload() << std::endl;
} int main()
{ server print_server;

print_server.set_message_handler(&on_message);
print_server.init_asio();
print_server. listen(9002);
print_server.start_accept(); print_server.run ();
}

在这个范例里面,他是通过websocketpp:: server <websocketpp::config:: asio >这个Endpoint,来建立一个使用Boost ASIO、没有TLS加密的WebSocket Server。这个server程序在执行后,会持续去监听port 9002,当有信息传递进来的时候,就会触发到on_message()这个函数、并把接到的信息输出到命令提示字符的窗口上。
如果想要测试连线的话,可以考虑用 WebSocket.org 提供的
不过实际上,由于WebSocket++ 本身也有log 的功能,所以除了收到的信息会被输出之外,还有很多纪录用的信息,也都会被输出在画面上,看起来可能会有点杂乱就是了。
另外,由于这个范例程序,只会从client接收信息,并不会传送数据给Server端,所以Echo Text的Log里面,并不会像连到ws:// echo.websocket.org
在源代码的地方,首先就是建立出一个endpoint的server物件print_server,用来做后续的操作。
而在建立出print_server后,接下来要做的事情,包括了:
初始化ASIO
调用init_asio()这个函数,初始化内部的Boost ASIO的io_service(官网),作为后续网络连线等功能之使用。
设置连接端口
调用listen()这个函数,指定要监听的连接端口;这边是设置成9002。
而如果系统上有多个网卡的话,默认会监听所有的网络接口;如果需要的话也可以特别指定要针对哪个接口做监听。
开始接受连线
调用start_accept()开始接受输入。
进入主循环
调用run(),进入WebSocket++ Server的主循环。
之后程序就会进入主循环,直到Server 被停下来。
那要怎么处理连线进来的信息呢?WebSocket++是通过提供各种“Handler”(callback function),来做事件的处理;在官方网站上,有列出可以使用的handler列表(页面)。
而在这个范例里,则是通过set_message_handler(),来设置当Server收到信息时,要执行的callback function,这里就是on_message()这个函数;这也是一般来说,一定会用到的callback function 。
而message handler 的callback function,会收到两个数据:
一个是websocketpp::connection_hdl型别的数据,是用来识别目前的连线用的;如果之后要传送信息给client的话,就必须要通过这个物件,来设置要把信息传送给谁。而如果有需要的话,也可以借由server<>的get_con_fromhdl()来取得触发这个 ??事件的连线、以及他的资讯。
第二个资讯,则是websocketpp::server<>::message_ptr,里面储存的是传递进来的信息。一般来说,这会通过他的get_payload()函数,来取得传递进来的信息,而得到的数据,会是const string&。不过由于WebSocket也有可能是传递非文字的binary数据,所以可能会需要通过 get_opcode()这个函数,来辨别传递进来的数据的形式。
而在这个范例里面,on_message()这个函数,就是很单纯地把街道的资讯,通过iostream做输出了~
在网页上的这个范例里面,这个Server只有做接收的功能,并不会送信息给Client端。那如果要送信息给client端要怎么做呢?基本上就是调用server<>的send()这个函数就可以了。
在官方的example文件夹里,有个echo_server的目录,里面的echo_server.cpp
而他送出数据的方法,就是:
s->send(hdl, msg->get_payload(), msg->get_opcode());
这边可以看到,要调用sned()这个函数来传递数据,基本上是需要给他三个参数:
websocketpp::connection_hdl的物件,让Server知道是要传给哪个client。
要传递的数据,这边就是直接把收到的信息(msg->get_payload())再传出去;实际上send()有提供不同的接口,实际的数据型别可以是const void*或const string&。
最后,则是要有一个opcode,来指定要传 ??递的资讯的形式;如果是纯文字的话,基本上可以直接指定websocketpp::frame::opcode::TEXT。
而这个范例程序在执行后,如果一样使用 WebSocket.org 的 来测试的话,就可以发现他的功能和 WebSocket.org 测试用的 ws://echo.websocket.org
Windows / Visual Studio 上的问题
上面基本上就是WebSocket++ 使用上的基本用法。不过实际上,这样的源代码,在Heresy 这边的Windows + Visual Studio 2010 / 2012,都是没办法正确建置的。
最主要的问题,基本上应该算是VC++ 本身对Boost C++ Library 的支援性问题吧…在Heresy 测试的结果是发现,如果希望在VisualStudio 2010 或2012 上使用的WebSocket++ 的话,有部分的功能??必须要强制让WebSocket++ 去使用C++ 11 的内建函数库,而不要去使用Boost 的版本。
设置的方法,可以参考官方的《C++11 Support》这页。以Heresy这边的测试来说,至少functional和memory两个函数库,是需要使用C++11 STL的版本才行的;也就是说,必须要加上_WEBSOCKETPP_CPP11_MEMORY_和_WEBSOCKETPP_CPP11_FUNCTIONAL_这两个定义(因为MSVC不支援完整的C++11,所以不能直接用_WEBSOCKETPP_CPP11_STL_)。
但是,在加上这两个定义后,实际上会产生另一个问题,那就是std::min()和巨集版本的min()冲到的问题(参考);这个问题,比较简单的方法,就是在再额外定义一个NOMINMAX,来取消掉巨集版本的min()和max()了。
所以,实际上要让上面的程序可以正常运作,一个方法就是在原始码的一开始、include WebSocket++ 的Header 之前,先加上下面三行:
#define NOMINMAX
#define _WEBSOCKETPP_CPP11_FUNCTIONAL_
#define _WEBSOCKETPP_CPP11_MEMORY_
或是在VC的专案属性的“组态属性”里面,找到“C/C++”的“前置处理器”,在“前置处理气定义”的栏位里面,加上“NOMINMAX;_WEBSOCKETPP_CPP11_FUNCTIONAL_;_WEBSOCKETPP_CPP11_MEMORY_”了。
理论上,这两种方法应该都可以让MSVC可以正确地建置上面的范例程序。而这个问题Heresy也有回报给作者了(链结),就看之后有没有办法修正吧。
另外,Heresy在使用Visual Studio 2012的时候,虽然可以正确编译了,可是在执行阶段,则是会当掉。稍微追了一下源代码后,发现应该是Visual Studio 2012的std::strftime()这个函数(MSDN)有问题所造成的。
主要的问题是发生在 logger/ basic.hpp这个文件,里面定义的get_timestamp()这个函数里面有透 ??过std::strftime()来打印出目前的时间,以做为纪录之用;而他定义的输出字串,则是一个长度30的C字串buffer。
由于他有试着输出时区的资讯(%z),而在Visual Sutdio里,如果在台湾的环境的话,他会是一个“台北标准时间”这样的文字;而这样的文字,再加上前面的时间资讯的会,就导致整个结果会超过30个字符。而在这个状况下,Visual Studio 2010只是会无法输出,但是在Visual Studio 2012,却可能是让程序整个当掉… orz
而解决方法呢?基本上应该是两种,一个是把buffer的大小改大、例如把它改成40(要改两个地方,一个是105行、一个是111行,参考),这样可以让字串够长、不会出问题;另一种方法,则是把105行里定义的时间格式字串“"%Y-%m-%d %H:%M:%S%z"”,最后面的“%z”拿掉,这样就不会去处理时区的资讯,也就比较不容易出问题了。

最后:这篇大概就这样了。内容,算是对WebSocket++ 的极简单介绍的~实际上,由于官方文件实在不足,所以学习起来有点累;不过,至少已经成功地用WebSocket++ 完成第一个WebSocket 的Server 端程序了~接下来,看看有什么特殊的想法,会再做补充吧。

B. 如何使用WebSocket

WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。
Cocos2d-x引擎集成libwebsockets,并在libwebsockets的客户端API基础上封装了一层易用的接口,使得引擎在C++, JS, Lua层都能方便的使用WebSocket来进行游戏网络通讯。
文章很长,给你一个链接:

【cocos2d-x教程】如何使用WebSocket_网络经验
http://jingyan..com/article/c33e3f48ae9158ea14cbb562.html

C. websocket怎么进行多个连接

1、首先在websocket代码中加入静态变量,private static long onlineCount = 0L;,用于统计连接数。

D. 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.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13

从服务器到客户端的内容:
代码如下 复制代码

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-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 state
const unsigned short CONNECTING = 0;
const unsigned short OPEN = 1;
const unsigned short CLOSED = 2;
readonly attribute unsigned short readyState;
readonly attribute unsigned long bufferedAmount;

// networking
attribute 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) {
//产生异常
};

E. 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的各个部分都有那些技术来实现.xml
9,而对于存在Cache管理的Bean则通过激活和去激活机制保持Bean的状态并限制内存中实例数量、接口和内部类:CORBA 标准是公共对象请求代理结构(Common Object Request Broker Architecture);一对一"、EJB的几种类型
会话(Session)Bean ,Javabean需要放在应用目录的WEB-INF目录的classes目录中;some method declare
Home 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.ej
else{
document、EJB2。 其目的为,MVC方面
1?
答。
6,应用目录需要满足Web应用目录要求。项目越复杂.RemoteException.value:使用SessionBean访问EntityBea
Message 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 declare
EJB类的代码
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组件。JSP
ublic 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

F. 如何使用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个消息回调。
onOpen
init会触发WebSocket链接服务器,如果成功,WebSocket就会调用onOpen,告诉调用者,客户端到服务器的通讯链路已经成功建立,可以收发消息了。
void WebSocketTestLayer::onOpen(network::WebSocket* ws)
{
if (ws == _wsiSendText)
{
_sendTextStatus->setString("Send Text WS was opened.");
}
}
onMessage
network::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.")
end

local function wsSendTextMessage(strData)
receiveTextTimes= receiveTextTimes + 1
local strInfo= "response text msg: "..strData..", "..receiveTextTimes
sendTextStatus:setString(strInfo)
end

local function wsSendTextClose(strData)
print("_wsiSendText websocket instance closed.")
sendTextStatus = nil
wsSendText = nil
end

local function wsSendTextError(strData)
print("sendText Error was fired")
end
Lua的消息注册不同于C++的继承 & Override,有单独的接口registerScriptHandler。 registerScriptHandler第一个参数是回调函数名,第二个参数是回调类型。 每一个WebSocket实例都需要绑定一次。
if nil ~= wsSendText then
wsSendText:registerScriptHandler(wsSendTextOpen,cc.WEBSOCKET_OPEN)
wsSendText:registerScriptHandler(wsSendTextMessage,cc.WEBSOCKET_MESSAGE)
wsSendText:registerScriptHandler(wsSendTextClose,cc.WEBSOCKET_CLOSE)
wsSendText:registerScriptHandler(wsSendTextError,cc.WEBSOCKET_ERROR)
end
send消息
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");
};

G. C 实现的 WebSocket 服务器握手失败

WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。在WebSocketAPI中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

H. c#的webSocket编程

.net4.5新增的对websockets服务器支持是在HttpListener类里实现的,获取WebSocket例子:

varlistener=newHttpListener();
listener.Prefixes.Add("http://*:8080/");
listener.Start();
varcontext=awaitlistener.GetContextAsync();
varwsContext=awaitcontext.AcceptWebSocketAsync(null);
varws=wsContext.WebSocket;

客户端

varws=newClientWebSocket();
awaitws.ConnectAsync(newUri("ws://127.0.0.1:8080"),CancellationToken.None);

I. 如何使用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个消息回调。
onOpen
init会触发WebSocket链接服务器,如果成功,WebSocket就会调用onOpen,告诉调用者,客户端到服务器的通讯链路已经成功建立,可以收发消息了。
void WebSocketTestLayer::onOpen(network::WebSocket* ws)
{
if (ws == _wsiSendText)
{
_sendTextStatus->setString("Send Text WS was opened.");
}
}
onMessage
network::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.")
end

local function wsSendTextMessage(strData)
receiveTextTimes= receiveTextTimes + 1
local strInfo= "response text msg: "..strData..", "..receiveTextTimes
sendTextStatus:setString(strInfo)
end

local function wsSendTextClose(strData)
print("_wsiSendText websocket instance closed.")
sendTextStatus = nil
wsSendText = nil
end

local function wsSendTextError(strData)
print("sendText Error was fired")
end
Lua的消息注册不同于C++的继承 & Override,有单独的接口registerScriptHandler。 registerScriptHandler第一个参数是回调函数名,第二个参数是回调类型。 每一个WebSocket实例都需要绑定一次。
if nil ~= wsSendText then
wsSendText:registerScriptHandler(wsSendTextOpen,cc.WEBSOCKET_OPEN)
wsSendText:registerScriptHandler(wsSendTextMessage,cc.WEBSOCKET_MESSAGE)
wsSendText:registerScriptHandler(wsSendTextClose,cc.WEBSOCKET_CLOSE)
wsSendText:registerScriptHandler(wsSendTextError,cc.WEBSOCKET_ERROR)
end
send消息
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中文,\0 I'm\0 a\0 binary\0 message\0.";
var binary = this._stringConvertToArray(buf);

this._wsiSendBinary.send(binary.buffer);
主动关闭WebSocket
当某个WebSocket的通讯不再使用的时候,我们必须手动关闭这个WebSocket与服务器的连接,以释放服务器和客户端的资源。close会触发onclose消息。
onExit: function() {

if (this._wsiSendText)

this._wsiSendText.close();

}

J. 如何使用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个消息回调。
onOpen
init会触发WebSocket链接服务器,如果成功,WebSocket就会调用onOpen,告诉调用者,客户端到服务器的通讯链路已经成功建立,可以收发消息了。
void WebSocketTestLayer::onOpen(network::WebSocket* ws)
{
if (ws == _wsiSendText)
{
_sendTextStatus->setString("Send Text WS was opened.");
}
}
onMessage
network::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.")
end
local function wsSendTextMessage(strData)
receiveTextTimes= receiveTextTimes + 1
local strInfo= "response text msg: "..strData..", "..receiveTextTimes
sendTextStatus:setString(strInfo)
end
local function wsSendTextClose(strData)
print("_wsiSendText websocket instance closed.")
sendTextStatus = nil
wsSendText = nil
end
local function wsSendTextError(strData)
print("sendText Error was fired")
end
Lua的消息注册不同于C++的继承 & Override,有单独的接口registerScriptHandler。 registerScriptHandler第一个参数是回调函数名,第二个参数是回调类型。 每一个WebSocket实例都需要绑定一次。
if nil ~= wsSendText then
wsSendText:registerScriptHandler(wsSendTextOpen,cc.WEBSOCKET_OPEN)
wsSendText:registerScriptHandler(wsSendTextMessage,cc.WEBSOCKET_MESSAGE)
wsSendText:registerScriptHandler(wsSendTextClose,cc.WEBSOCKET_CLOSE)
wsSendText:registerScriptHandler(wsSendTextError,cc.WEBSOCKET_ERROR)
end
send消息
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中文,\0 I'm\0 a\0 binary\0 message\0.";
var binary = this._stringConvertToArray(buf);
this._wsiSendBinary.send(binary.buffer);
主动关闭WebSocket
当某个WebSocket的通讯不再使用的时候,我们必须手动关闭这个WebSocket与服务器的连接,以释放服务器和客户端的资源。close会触发onclose消息。
onExit: function() {
if (this._wsiSendText)
this._wsiSendText.close();
}

阅读全文

与cwebsocket编程相关的资料

热点内容
机票php源码 浏览:231
linux共享mac 浏览:922
中国没有国外的服务器地址 浏览:757
为什么退款服务器连接错误 浏览:555
android短信存储位置 浏览:970
unix网络编程卷4 浏览:808
找靓机app下单什么时候发货 浏览:413
android一个应用两个进程 浏览:802
linux硬盘复制 浏览:808
php图片服务器搭建 浏览:801
下载压缩文件怎么打开 浏览:194
新建文件夹叫什么名字 浏览:567
windows20的开机命令 浏览:334
微信一般在电脑的那个文件夹 浏览:511
go在win7下编译特别慢 浏览:256
光遇ios耳机安卓为什么没有 浏览:904
小米手机桌面文件夹经常自动散开 浏览:607
小米电话手表用什么app进行设置 浏览:265
虚拟打印机pdf下载 浏览:671
jdk编译运行方法 浏览:459