0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鸿蒙上WebSocket的使用方法

OpenHarmony技术社区 来源:OST开源开发者 2023-03-08 14:17 次阅读

WebSocket 是一种网络通讯协议,很多网络开发工作者都需要它。本文介绍在 OpenHarmony 上 WebSocket 协议的使用方法。

WebSocket 有什么不同

很多人会问,有了 HTTP 协议,尤其是 RESTFul 接口,为什么还需要使用 WebSocket?它能带来什么好处呢?那是因为 HTTP 协议有一个缺陷,通讯只能由客户端发起。

简单举例,我们的天气应用程序需要查询天气就需要客户端向服务器请求数据,服务器查询后返回结果。

但是如果天气有变化,客户端是无法收到服务端推送过来的消息,所以只能定时调用或者用户手动刷新。

这种单向请求导致需要双向通讯的应用只能在客户端采用轮询的手段来实现,引申出来的问题就是效率低,服务端负载大。所以就诞生了 WebSocket。

WebSocket 简介

WebSocket 协议诞生于 2008 年,2011 年成为国际标准,所有浏览器都支持。它最大的特点就是双向平等对话,属于服务器推送技术的一种。

HTTP 流程:

0bf3842c-b9cf-11ed-bfe3-dac502259ad0.png

WebSocket 流程:

0c0aee8c-b9cf-11ed-bfe3-dac502259ad0.png

特点:

在 TCP 协议上层,服务器端的实现比较容易。

与HTTP 协议有着良好的兼容性。默认端口也是 80 和 443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。

数据格式比较轻量,性能开销小,通信高效。

可发送文本,也可发送二进制数据。

没有同源限制,客户端可以与任意服务器通信。

协议标识符是 ws(如果加密,则为 wss),服务器网址就是 URL。

0c2e912a-b9cf-11ed-bfe3-dac502259ad0.png

WebSocket在OpenHarmony上的实现

如下图:

0c5c011e-b9cf-11ed-bfe3-dac502259ad0.png

WebSocket在OpenHarmony上的使用

导入 d.ts 文件:

//导入websocket接口
importwebSocketfrom'@ohos.net.webSocket'
//websocket的基本接口函数
connect(url:string,callback:AsyncCallback):void;
send(data:string|ArrayBuffer,callback:AsyncCallback):void;
close(callback:AsyncCallback):void;
基本的 websocket 流程:
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层的实现

Napi 接口实现:

//foundation/communication/netstack/frameworks/js/napi/websocket/websocket_module/src/websocket_module.cpp
std::initializer_listproperties={
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);
}
执行结果日志打印:
//正确连接
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

//错误连接
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

小结

OpenHarmony 目前已支持 WebSocket 调用,通过回调函数返回调用结果。

作者:王石

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    12

    文章

    9010

    浏览量

    85160
  • 网络通讯
    +关注

    关注

    0

    文章

    74

    浏览量

    11247
  • WebSocket
    +关注

    关注

    0

    文章

    29

    浏览量

    3733
  • 鸿蒙
    +关注

    关注

    57

    文章

    2306

    浏览量

    42728
  • OpenHarmony
    +关注

    关注

    25

    文章

    3657

    浏览量

    16128

原文标题:鸿蒙上WebSocket的使用方法

文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony技术社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    鸿蒙原生应用开发-网络管理WebSocket连接

    一、场景介绍 使用WebSocket建立服务器与客户端的双向连接,需要先通过createWebSocket()方法创建WebSocket对象,然后通过connect()方法连接到服务器
    发表于 04-07 09:46

    【开发实录】在鸿蒙开发板上使用websocket(移植自librws库)

    librws: Tiny, cross platform websocket client C library相关代码可在下面下载,也可进入librws: 将librws移植到鸿蒙Hi_3861
    发表于 11-24 11:19

    请问鸿蒙hap包是否支持插件化开发?

    如题,安卓上可以使用dexclassloader机制动态加载其他apk作为插件使用,鸿蒙上用类似的能力吗?有什么解决方案呢?
    发表于 06-16 11:34

    示波器的使用方法

    数字万用表使用方法和示波器的使用方法详解。
    发表于 03-14 10:38 32次下载

    什么是WebSocket?进行通信解析 WebSocket 报文及实现

    一般情况下全为 0。当客户端、服务端协商采用 WebSocket 扩展时,这三个标志位可以非0,且值的含义由扩展进行定义。如果出现非零的值,且并没有采用 WebSocket 扩展,连接出错。
    的头像 发表于 05-15 16:59 9745次阅读
    什么是<b class='flag-5'>WebSocket</b>?进行通信解析 <b class='flag-5'>WebSocket</b> 报文及实现

    鸿蒙系统上市后到底可不可以把现有手机安卓系统换成鸿蒙系统

    鸿蒙上市后,我可以把现有手机安卓系统换成鸿蒙吗?华为为了扩大鸿蒙系统使用范围,应该是对不算很老的机型可以进行系统替换,这是扩大市场最快且最方便的方法,华为应该是不会放弃这样的操作
    的头像 发表于 02-03 12:47 3w次阅读

    WebSocket有什么优点

    WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。HTML5开始提
    的头像 发表于 02-15 15:53 8248次阅读
    <b class='flag-5'>WebSocket</b>有什么优点

    WebSocket工作原理及使用方法

    它有很多名字; WebSocketWebSocket协议和WebSocket API。从首选的消息传递应用程序到流行的在线多人游戏,WebSocket在当今最常用的Web应用程序中是
    的头像 发表于 05-05 22:12 7838次阅读
    <b class='flag-5'>WebSocket</b>工作原理及<b class='flag-5'>使用方法</b>

    示波器的使用方法(三):示波器的使用方法详解

    示波器的使用方法并非很难,重点在于正确使用示波器的使用方法。往期文章中,小编对模拟示波器的使用方法和数字示波器的使用方法均有所介绍。为增进大家对示波器的
    的头像 发表于 12-24 20:37 3185次阅读

    鸿蒙上使用Python进行物联网编程

    炫耀!然而,这却是非常重要的一步:在鸿蒙上用使用 Python 进行物联网编程是可行的!!! 既然可行,加上 Python 语言天生的优势(易于掌握,开发效率高),那么真的值得持续打造,将鸿蒙上的 Python 进行到底。 所以,今天的主题就是利用 GPIO 搭配 I2C
    的头像 发表于 09-28 09:55 4241次阅读
    在<b class='flag-5'>鸿蒙上</b>使用Python进行物联网编程

    鸿蒙上安装按钮实现下载、暂停、取消、显示等操作

    今天给大家分享在鸿蒙上一个按钮实现下载、暂停、取消、显示下载进度操作。
    的头像 发表于 01-04 14:32 2240次阅读

    鸿蒙上实现“数字华容道”小游戏

    本篇文章教大家如何在鸿蒙上实现“数字华容道”小游戏。
    的头像 发表于 12-26 09:52 1193次阅读

    鸿蒙上开发“小蜜蜂”游戏

    小时候我们有个熟悉的游戏叫小蜜蜂。本文教大家在鸿蒙上学做这个小蜜蜂游戏。
    的头像 发表于 04-03 11:27 1617次阅读

    websocket协议的原理

    WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。 WebSocket通信协议于2011年被IETF
    的头像 发表于 11-09 15:13 1104次阅读
    <b class='flag-5'>websocket</b>协议的原理

    鸿蒙开发网络管理:ohos.net.webSocket WebSocket连接

    使用WebSocket建立服务器与客户端的双向连接,需要先通过[createWebSocket]方法创建[WebSocket]对象,然后通过[connect]方法连接到服务器。当连接成
    的头像 发表于 06-19 17:12 432次阅读
    <b class='flag-5'>鸿蒙</b>开发网络管理:ohos.net.<b class='flag-5'>webSocket</b> <b class='flag-5'>WebSocket</b>连接