想了解更多內容,請訪問: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