WebSocket 是一種網(wǎng)絡(luò)通訊協(xié)議,很多網(wǎng)絡(luò)開(kāi)發(fā)工作者都需要它。本文介紹在 OpenHarmony 上 WebSocket 協(xié)議的使用方法。
WebSocket 有什么不同
很多人會(huì)問(wèn),有了 HTTP 協(xié)議,尤其是 RESTFul 接口,為什么還需要使用 WebSocket?它能帶來(lái)什么好處呢?那是因?yàn)?HTTP 協(xié)議有一個(gè)缺陷,通訊只能由客戶端發(fā)起。
簡(jiǎn)單舉例,我們的天氣應(yīng)用程序需要查詢天氣就需要客戶端向服務(wù)器請(qǐng)求數(shù)據(jù),服務(wù)器查詢后返回結(jié)果。
但是如果天氣有變化,客戶端是無(wú)法收到服務(wù)端推送過(guò)來(lái)的消息,所以只能定時(shí)調(diào)用或者用戶手動(dòng)刷新。
這種單向請(qǐng)求導(dǎo)致需要雙向通訊的應(yīng)用只能在客戶端采用輪詢的手段來(lái)實(shí)現(xiàn),引申出來(lái)的問(wèn)題就是效率低,服務(wù)端負(fù)載大。所以就誕生了 WebSocket。
WebSocket 簡(jiǎn)介
WebSocket 協(xié)議誕生于 2008 年,2011 年成為國(guó)際標(biāo)準(zhǔn),所有瀏覽器都支持。它最大的特點(diǎn)就是雙向平等對(duì)話,屬于服務(wù)器推送技術(shù)的一種。
HTTP 流程:

WebSocket 流程:

特點(diǎn):
在 TCP 協(xié)議上層,服務(wù)器端的實(shí)現(xiàn)比較容易。
與HTTP 協(xié)議有著良好的兼容性。默認(rèn)端口也是 80 和 443,并且握手階段采用 HTTP 協(xié)議,因此握手時(shí)不容易屏蔽,能通過(guò)各種 HTTP 代理服務(wù)器。
數(shù)據(jù)格式比較輕量,性能開(kāi)銷小,通信高效。
可發(fā)送文本,也可發(fā)送二進(jìn)制數(shù)據(jù)。
沒(méi)有同源限制,客戶端可以與任意服務(wù)器通信。
協(xié)議標(biāo)識(shí)符是 ws(如果加密,則為 wss),服務(wù)器網(wǎng)址就是 URL。

WebSocket在OpenHarmony上的實(shí)現(xiàn)
如下圖:

WebSocket在OpenHarmony上的使用
導(dǎo)入 d.ts 文件:
//導(dǎo)入websocket接口 importwebSocketfrom'@ohos.net.webSocket' //websocket的基本接口函數(shù) connect(url:string,callback:AsyncCallback基本的 websocket 流程:):void; send(data:string|ArrayBuffer,callback:AsyncCallback ):void; close(callback:AsyncCallback ):void;
letpromise=socket.connect(url)
promise.then((value)=>{
Logger.info(TAG,`connectsuccess`)
}).catch((err)=>{
Logger.info(TAG,`connectfail,error:${JSON.stringify(err)}`)
})
socket.on('open',(err,value)=>{
prompt.showToast({message:'連接成功',duration:1500})
})
socket.on('message',(err,value)=>{
Logger.info(TAG,`onmessage,value=${value}`)
})
Framework層的實(shí)現(xiàn)
Napi 接口實(shí)現(xiàn):
//foundation/communication/netstack/frameworks/js/napi/websocket/websocket_module/src/websocket_module.cpp std::initializer_list異步執(zhí)行動(dòng)作:properties={ DECLARE_NAPI_FUNCTION(WebSocket::FUNCTION_CONNECT,WebSocket::Connect), DECLARE_NAPI_FUNCTION(WebSocket::FUNCTION_SEND,WebSocket::Send), DECLARE_NAPI_FUNCTION(WebSocket::FUNCTION_CLOSE,WebSocket::Close), DECLARE_NAPI_FUNCTION(WebSocket::FUNCTION_ON,WebSocket::On), DECLARE_NAPI_FUNCTION(WebSocket::FUNCTION_OFF,WebSocket::Off), }; ModuleTemplate::DefineClass(env,exports,properties,INTERFACE_WEB_SOCKET);
//foundation/communication/netstack/frameworks/js/napi/websocket/async_work/src/websocket_async_work.cpp
//初始化libwebsocket需要的callback
staticconstlws_protocolsLWS_PROTOCOLS[]={
{"lws-minimal-client",WebSocketExec::LwsCallback,0,0},
{nullptr,nullptr,0,0},//thislineisneeded
};
//填裝websocket上下文信息
staticinlinevoidFillContextInfo(lws_context_creation_info&info)
{
info.options=LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;
info.port=CONTEXT_PORT_NO_LISTEN;
info.protocols=LWS_PROTOCOLS;
info.fd_limit_per_thread=FD_LIMIT_PER_THREAD;
}
voidWebSocketAsyncWork::ExecConnect(napi_envenv,void*data)
{
BaseAsyncWork::ExecAsyncWork(env,data);
}
voidWebSocketAsyncWork::ExecSend(napi_envenv,void*data)
{
BaseAsyncWork::ExecAsyncWork(env,data);
}
voidWebSocketAsyncWork::ExecClose(napi_envenv,void*data)
{
BaseAsyncWork::ExecAsyncWork(env,data);
}
執(zhí)行結(jié)果日志打?。?//正確連接 IC015b0/NetMgrSubsystem:NETSTACK[connect_context.cpp43]ConnectContextNapiUtils::GetValueType(GetEnv(),params[1])==napi_function IC015b0/NetMgrSubsystem:NETSTACK[module_template.h61]jsparamsparseOK?1 IC015b0/NetMgrSubsystem:NETSTACK[websocket_exec.cpp471]beginconnect,parseurl EC015b0/NetsysNativeService:[HookSocket-(netsys_sock_client.cpp:45)]muslcreatesocketfailed IC015b0/NetMgrSubsystem:NETSTACK[websocket_exec.cpp228]startservice IC015b0/NetMgrSubsystem:NETSTACK[websocket_exec.cpp533]ConnectCallbackconnectsuccess //錯(cuò)誤連接 IC015b0/NetMgrSubsystem:NETSTACK[connect_context.cpp43]ConnectContextNapiUtils::GetValueType(GetEnv(),params[1])==napi_function IC015b0/NetMgrSubsystem:NETSTACK[module_template.h61]jsparamsparseOK?1 IC015b0/NetMgrSubsystem:NETSTACK[websocket_exec.cpp471]beginconnect,parseurl EC015b0/NetsysNativeService:[HookSocket-(netsys_sock_client.cpp:45)]muslcreatesocketfailed IC015b0/NetMgrSubsystem:NETSTACK[websocket_exec.cpp358]LwsCallbackClientConnectionErrorDNSNXDOMAIN IC015b0/NetMgrSubsystem:NETSTACK[websocket_exec.cpp427]LwsCallbackWsiDestroy IC015b0/NetMgrSubsystem:NETSTACK[websocket_exec.cpp515]ExecConnectwebsocketconnectfailed IC015b0/NetMgrSubsystem:NETSTACK[websocket_exec.cpp433]LwsCallbackProtocolDestroy IC015b0/NetMgrSubsystem:NETSTACK[websocket_exec.cpp530]ConnectCallbackconnectfailed
小結(jié)
OpenHarmony 目前已支持 WebSocket 調(diào)用,通過(guò)回調(diào)函數(shù)返回調(diào)用結(jié)果。
作者:王石
-
服務(wù)器
+關(guān)注
關(guān)注
13文章
10018瀏覽量
90403 -
網(wǎng)絡(luò)通訊
+關(guān)注
關(guān)注
0文章
78瀏覽量
12300 -
WebSocket
+關(guān)注
關(guān)注
0文章
33瀏覽量
4325 -
鴻蒙
+關(guān)注
關(guān)注
60文章
2747瀏覽量
45148 -
OpenHarmony
+關(guān)注
關(guān)注
31文章
3897瀏覽量
20503
原文標(biāo)題:鴻蒙上WebSocket的使用方法
文章出處:【微信號(hào):gh_834c4b3d87fe,微信公眾號(hào):OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
鴻蒙原生應(yīng)用開(kāi)發(fā)-網(wǎng)絡(luò)管理WebSocket連接
【開(kāi)發(fā)實(shí)錄】在鴻蒙開(kāi)發(fā)板上使用websocket(移植自librws庫(kù))
請(qǐng)問(wèn)鴻蒙hap包是否支持插件化開(kāi)發(fā)?
什么是WebSocket?進(jìn)行通信解析 WebSocket 報(bào)文及實(shí)現(xiàn)
鴻蒙系統(tǒng)上市后到底可不可以把現(xiàn)有手機(jī)安卓系統(tǒng)換成鴻蒙系統(tǒng)
WebSocket有什么優(yōu)點(diǎn)
WebSocket工作原理及使用方法
示波器的使用方法(三):示波器的使用方法詳解
在鴻蒙上使用Python進(jìn)行物聯(lián)網(wǎng)編程
鴻蒙上安裝按鈕實(shí)現(xiàn)下載、暫停、取消、顯示等操作
鴻蒙上實(shí)現(xiàn)“數(shù)字華容道”小游戲
鴻蒙上開(kāi)發(fā)“小蜜蜂”游戲
websocket協(xié)議的原理
鴻蒙開(kāi)發(fā)網(wǎng)絡(luò)管理:ohos.net.webSocket WebSocket連接

鴻蒙上WebSocket的使用方法
評(píng)論