想了解更多内容,请访问:java
https://harmonyos.51cto.com/#bkwzgolang
librws: Tiny, cross platform websocket client C libraryweb
相关代码可在下面下载,也可进入librws: 将librws移植到鸿蒙Hi_3861开发板上 (gitee.com)查看ajax
技术有限,若有错误还望不吝赐教。windows
基础:完成官方的快速入门教程服务器
虽然在web双向通讯中,除了使用ajax(单向轮询)外,通常都推荐websocket,但网上关于websocket的实现代码不多,并且大部分为js和java,不多有C语言。由于课程项目开发须要使用到websocket,就在网上寻找了挺久的,终于找到了这个库。相对于其余库来讲,这个库须要跨平台的代码都用了一层适配层,并且没有用到其余例如libevent等其余库,用他的话说就是"No additional dependecies",因此移植挺方便的。而后由于这个库除了windows平台外,其余平台都是使用POSIX接口,而Hi_3861上只有POSIX的声明,但并无实现(详细可看【开发实录】在Hi3861开发板上建立线程(三种方式)-鸿蒙HarmonyOS技术社区-官方战略合做伙伴-51CTO.COM里面有所说明)。因此适配相关的函数以及处理一些小细节。websocket
这篇文章主要介绍如何使用,下一篇可能会介绍如何移植,你们有需求的话,可先学习连志安老师的如何在鸿蒙系统中移植 Paho-MQTT 实现MQTT协议-鸿蒙HarmonyOS技术社区-官方战略合做伙伴-51CTO.COM文章,这篇文章有挺大的参考价值的。socket
一、向项目中导入此库ide
下载下面的librws资源放至//third_party目录下,而后在//vendor/hisi/hi3861/hi3861/BUILD.gn文件中的lite_component("sdk")-->deps下添加 "//third_party/librws:librws_static" 这样就能够在下次编译时将相关代码编译成库放进项目内了。
二、编写应用代码
先使用板子链接上wifi,具体操做可查看Hi3861 WiFi操做,热点链接-鸿蒙HarmonyOS技术社区-官方战略合做伙伴-51CTO.COM,须要注意,链接WiFi后要sleep一段时间。下面资源有相关代码。
而后配置相关信息
rws_socket _socket = NULL; _socket = rws_socket_create(); rws_socket_set_scheme(_socket, "ws"); rws_socket_set_host(_socket, "192.168.1.103"); rws_socket_set_port(_socket, 7777); rws_socket_set_path(_socket, "/ws");
注意配置信息必定要对应真实信息,下面我会分享个人websocket服务端测试代码。
而后配置回调函数
// 因主动或者出现错误时,断开链接的回调函数 static void on_socket_disconnected(rws_socket socket) { // process error rws_error error = rws_socket_get_error(socket); if (error) { printf("Socket disconnect with code, error: %i, %s\n", rws_error_get_code(error), rws_error_get_description(error)); } // forget about this socket object, due to next disconnection sequence socket = NULL; } // 创建连接完成后的回调函数 static void on_socket_connected(rws_socket socket) { (void) socket; printf("Socket connected\n"); } // 接受到信息的回调函数 static void on_socket_received_text(rws_socket socket, const char * text, const unsigned int length) { (void) socket; char *buff[128] = {0}; memcpy_s(buff, 128, text, length); printf("Socket text: %s\n", buff); }
// 设置回调函数 rws_socket_set_on_disconnected(_socket, &on_socket_disconnected); // required rws_socket_set_on_connected(_socket, &on_socket_connected); rws_socket_set_on_received_text(_socket, &on_socket_received_text);
须要注意一个地方,在接受信息回调函数中,原仓库的测试代码是直接打印text,但测试发现,text变量除了接受到的信息还会包括一部分乱码,因此使用了memcpy_s函数复制有效的信息在打印。你们编写接受回调函数时须要注意这个地方。
接下来就是链接,发送消息以及关闭了
printf("[RWS]ready to connect\n"); rws_bool res = rws_socket_connect(_socket); if(res == rws_false) { printf("[RWS]error connect\n"); exit(1); } sleep(2); const char * example_text = "hello world"; printf("[RWS]ready to send msg\n"); rws_socket_send_text(_socket, example_text); sleep(2); printf("[RWS]ready to disconnect\n"); rws_socket_disconnect_and_release(_socket); _socket = NULL; return;
三、测试代码
服务器代码使用的是golang,详细代码在下方下载。在代码文件当前目录运行命令:
go run server.go
四、其余文章
相关附件能够点击原文连接前往下载:https://harmonyos.51cto.com/posts/1793