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();
}