仓颉编程语言:WebSocket 编程

【仓颉三方库】 网络组件——hyperion Hyperion: 一个支持自定义编解码器的TCP通信框架Redis仓颉语言客户端SDK: redis-sdk 项目使用了该TCP框架,并实现了RESP2、RESP3协议的编解码。 ActiveMQ仓颉语言客户端SDK:acitvemq4cj项目使用了该TCP框架。工程目录结构 1.1 编译步骤 清理工程,在工程根目录下运行: 编译工程,在工程根目录下运行: 编译的静态库位于: 在工程根目录下运行: 编译服务端示例程序,在samples/echo_server目录下运行: 启动服务端,在sample 阅读详情

在网络编程中,WebSocket 也是一种常用的应用层协议,与 HTTP 一样,它也基于 TCP 协议之上,并且常用于 web 服务端应用开发。

不同于 HTTP 的是, WebSocket 只需要客户端和服务端进行一次握手,即可创建长久的连接,并且进行双向的数据传输。即,基于 WebSocket 实现的服务端可以主动传输数据给客户端,从而实现实时通讯。

WebSocket 是一个独立的协议,它与 HTTP 的关联在于,它的握手被 HTTP 服务端解释为一个升级请求。因此,仓颉将 WebSocket 包含在 http 包中。

仓颉将 WebSocket 协议通信机制抽象为 WebSocket 类,提供方法将一个 http/1.1 或 http/2.0 服务端句柄升级到 WebSocket 协议实例,通过返回的 WebSocket 实例进行 WebSocket 通信,例如数据报文的读写。

在仓颉中,WebSocket 所传输的数据基本单元称为帧,帧分为两类,一类为传输控制信息的帧,即 Close Frame 用于关闭连接, Ping Frame 用于实现 Keep-Alive , Pong Frame 是 Ping Frame 的响应类型,另一类是传输应用数据的帧,应用数据帧支持分段传输。

仓颉的帧由三个属性构成,其中 fin 和 frameType 共同说明了帧是否分段和帧的类型。payload 为帧的载荷,除此之外开发者无需关心其他属性即可进行报文传输。

如下示例展示了 WebSocket 的握手以及消息收发过程:创建 HTTP 客户端和服务端,分别发起 WebSocket 升级(或握手),握手成功后开始帧的读写。

import net.http.*
import encoding.url.*
import std.time.*
import std.sync.*
import std.collection.*
import std.log.*

let server = ServerBuilder()
                        .addr("127.0.0.1")
                        .port(0)
                        .build()

// client:
main() {
    // 1 启动服务器
    spawn { startServer() }
    sleep(Duration.millisecond * 200)

    let client = ClientBuilder().build()
    let u = URL.parse("ws://127.0.0.1:${server.port}/webSocket")

    let subProtocol = ArrayList<String>(["foo1", "bar1"])
    let headers = HttpHeaders()
    headers.add("test", "echo")

    // 2 完成 WebSocket 握手,获取 WebSocket 实例
    let websocket: WebSocket
    let respHeaders: HttpHeaders
    (websocket, respHeaders) = WebSocket.upgradeFromClient(client, u, subProtocols: subProtocol, headers: headers)
    client.close()

    println("subProtocol: ${websocket.subProtocol}")      // fool1
    println(respHeaders.getFirst("rsp") ?? "") // echo

    // 3 消息收发
    // 发送 hello
    websocket.write(TextWebFrame, b"hello")
    // 收
    let data = ArrayList<UInt8>()
    var frame = websocket.read()
    while(true) {
        match(frame.frameType) {
            case ContinuationWebFrame =>
                data.appendAll(frame.payload)
                if (frame.fin) {
                    break
                }
            case TextWebFrame | BinaryWebFrame =>
                if (!data.isEmpty()) {
                    throw Exception("invalid frame")
                }
                data.appendAll(frame.payload)
                if (frame.fin) {
                    break
                }
            case CloseWebFrame =>
                websocket.write(CloseWebFrame, frame.payload)
                break
            case PingWebFrame =>
                websocket.writePongFrame(frame.payload)
            case _ => ()
        }
        frame = websocket.read()
    }
    println("data size: ${data.size}")      // 4097
    println("last item: ${String.fromUtf8(Array(data)[4096])}")        // a



    // 4 关闭 websocket,
    // 收发 CloseFrame
    websocket.writeCloseFrame(status: 1000)
    let websocketFrame = websocket.read()
    println("close frame type: ${websocketFrame.frameType}")      // CloseWebFrame
    println("close frame payload: ${websocketFrame.payload}")     // 3, 232
    // 关闭底层连接
    websocket.closeConn()

    server.close()
}

func startServer() {
    // 1 注册 handler
    server.distributor.register("/webSocket", handler1)
    server.logger.level = OFF
    server.serve()
}

// server:
func handler1(ctx: HttpContext): Unit {
    // 2 完成 websocket 握手,获取 websocket 实例
    let websocketServer = WebSocket.upgradeFromServer(ctx, subProtocols: ArrayList<String>(["foo", "bar", "foo1"]),
        userFunc: {request: HttpRequest =>
            let value = request.headers.getFirst("test") ?? ""
            let headers = HttpHeaders()
            headers.add("rsp", value)
            headers
        })
    // 3 消息收发
    // 收 hello
    let data = ArrayList<UInt8>()
    var frame = websocketServer.read()
    while(true) {
        match(frame.frameType) {
            case ContinuationWebFrame =>
                data.appendAll(frame.payload)
                if (frame.fin) {
                    break
                }
            case TextWebFrame | BinaryWebFrame =>
                if (!data.isEmpty()) {
                    throw Exception("invalid frame")
                }
                data.appendAll(frame.payload)
                if (frame.fin) {
                    break
                }
            case CloseWebFrame =>
                websocketServer.write(CloseWebFrame, frame.payload)
                break
            case PingWebFrame =>
                websocketServer.writePongFrame(frame.payload)
            case _ => ()
        }
        frame = websocketServer.read()
    }
    println("data: ${String.fromUtf8(Array(data))}")    // hello
    // 发 4097 个 a
    websocketServer.write(TextWebFrame, Array<UInt8>(4097, item: 97))

    // 4 关闭 websocket,
    // 收发 CloseFrame
    let websocketFrame = websocketServer.read()
    println("close frame type: ${websocketFrame.frameType}")   // CloseWebFrame
    println("close frame payload: ${websocketFrame.payload}")     // 3, 232
    websocketServer.write(CloseWebFrame, websocketFrame.payload)
    // 关闭底层连接
    websocketServer.closeConn()
}

该示例运行结果如下:

subProtocol: foo1
echo
data: hello
data size: 4097
last item: a
close frame type: CloseWebFrame
close frame payload: [3, 232]
close frame type: CloseWebFrame
close frame payload: [3, 232]

 看完三件事❤️

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注作者公众皓 『 蜀道衫 』,不定期分享原创知识。
  • 关注后回复【666】扫码即可获取学习资料包。
  • 同时可以期待后续文章ing🚀。

​

【鸿蒙实战开发】仓颉创建静态库及使用 “仓颉编程语言是一款面向全场景智能的新一代编程语言,主打原生智能化、天生全场景、高性能、强安全。融入鸿蒙生态,为开发者提供良好的编程体验。” 阅读详情

相关推荐

仓颉语言 -- 网络编程

仓颉语言 -- 网络编程

chinusyan的专栏 1991

仓颉web框架--返回JSON格式数据

JSON数据格式能够在多种编程语言中被轻松地读取和解析,包括客户端JavaScript以及服务器端的ActionScript,C,C#,ColdFusion,Java,JavaScript,Perl,PHP,Python,Ruby等语言。JSON数据格式的解析和生成相对容易,大多数现代编程语言都提供了内置的支持或者第三方库来处理JSON数据。JSON是一种轻量级的数据交换格式,它的设计目标是易于人阅读和编写,同时也易于机器解析和生成。JSON格式简单,易于读写,格式紧凑,占用带宽小,易于推导这种语言。

2201_75988493的博客 1191

HarmonyOS 6.0 PC 实战:仓颉语言 × ArkUI 从零构建 AI Agent 技能调度全栈应用

本文探讨了如何在鸿蒙PC端实现OpenClaw大龙虾AI Agent工具的跨端适配问题。针对鸿蒙生态与主流AI Agent框架的技术适配鸿沟,项目提出了一套全国产技术栈解决方案:采用仓颉语言(Cangjie)实现服务端运行时,结合ArkTS/ArkUI开发前端应用。系统架构包含服务端分层设计、标准化技能协议、多LLM接入支持及WASM安全沙箱等核心模块,通过HTTP REST/WebSocket实现前后端通信。该方案有效解决了鸿蒙PC端AI应用开发中的接口兼容性、运行效率和调试成本等问题,为AI Agent

leon_teacher 706

仓颉基于http协议的web开发

3.最后,如果出现html页面中的视频文件播放时有音效但是没有画面的情况,可能是MP4视频的编码格式的问题,案例中使用的编码格式为H.264。http是一种用于分布式、协作式超媒体信息系统的应用层协议,它定义了客户端与服务器之间请求与响应的标准格式和交互流程。应用场景:访问网页、API数据查询、下载文件等。将对应文件的IP地址,写到html标签<video>和<audio>的src路径中,如上图所示。POST请求:用途:向服务器提交数据(如表单、文件上传、JSON数据等)GET请求:用途:获取服务器资源。

w_zero_one的博客 814

鸿蒙HarmonyOS应用开发 | 仓颉开发语言中的网络编程详解-从 Socket 到 WebSocket 的全面指南

网络编程是通过计算机网络进行设备间数据交换的过程。在仓颉中,标准库提供了丰富的 API 支持,开发者可以利用这些 API 实现各种传输层协议的网络通信,例如 TCP、UDP 和 Unix Domain。常见的应用层协议如 HTTP 和 WebSocket 也在仓颉中得到了充分支持。本文详细介绍了仓颉开发语言中的网络编程功能,从基础的Socket编程到高级的 HTTP 和 WebSocket 编程,展示了仓颉如何通过简洁而强大的 API 帮助开发者实现复杂的网络通信功能。

一键难忘的博客 3315

搭建PX4开发系统(Ubuntu 22.04)

本文是《从零开始学 PX4 无人机开发》系列第二篇,适合开发者在 Ubuntu 系统下快速搭建 PX4 编译与仿真环境,支持 QGroundControl、Gazebo、MAVSDK 等完整工具链。

qq_15856721的博客 4222

仓颉编程语言中的HTTP与WebSocket编程详解

简洁的API设计:通过构建器模式和高层抽象简化开发协议完整性:全面支持HTTP/1.1、HTTP/2和WebSocket协议性能优化:内置连接池、压缩等优化手段安全内置:提供TLS、认证等安全功能可扩展架构:支持中间件、过滤器等扩展点掌握这些网络编程技术,开发者可以高效构建Web服务、实时通信系统等各类网络应用。建议从简单示例开始,逐步深入理解协议细节和高级特性,最终开发出高性能、高可靠的网络服务。

Huang兄 787

基于远程服务器 Tip_Adapter源码从零开始复现

从零一步步实现源代码的运行

zcyzcyjava的博客 1604

仓颉(Cangjie)语言之网络编程浅析

本文系统性地涵盖了从基础的 TCP/UDP 网络模型到高级的 HTTP、WebSocket 数据传输协议的实现,详细探讨了仓颉语言标准库中相关的网络模块(如 socket、net.http、net.tls),并分析了其并发模型与异步 I/O 的实现方式。仓颉的标准库中包含了底层的 socket 模块,为开发者提供了进行 TCP 和 UDP 通信的基础能力。网络编程的基石是操作系统提供的套接字(Socket)接口,它屏蔽了底层网络协议的复杂性,为应用程序提供了一套标准的通信 API。

EscaRC的博客 1670

labview设置工业摄像头外部触发

使用labview对海康MV-CA013-GM相机设置外部触发。 一、硬件部分 1、硬件引脚定义 2、触发模式设置 相机的触发模式分为两种,一种是内触发模式、另外一种是外触发模式。 3、接线图 信号线的地要跟给信号的设备共地。信号线给高电平时触发拍照。 二、软件部分 1、创建vision acquisition 2、选择使用的摄像头。 3、选择模式。 4、在Acquisition Control中设置这些选项。 5、设置保存图片路径 设置保存路径和保存图片的格式。点击完成即可 参考:https:/

qq_43493715的博客 5668

Cesium高效渲染海量GeoJSON数据的7种优化策略与实战解析

本文深入解析Cesium高效渲染海量GeoJSON数据的7种优化策略,包括瓦片化转换、LOD分级加载、数据简化等关键技术。通过实战案例展示如何解决渲染卡顿问题,提升矢量数据加载性能,实现流畅的60FPS交互体验。特别针对GeoJSON大数据量场景提供完整优化方案。

h0i1j2k3l的博客 935

仓颉语言服务端开发实战:搭建高并发接口,适配鸿蒙多终端调用

摘要: 本文介绍了使用华为自研的仓颉语言(Cangjie)开发高并发服务端接口并适配鸿蒙多终端调用的实战方案。仓颉语言凭借强类型、高并发、低延迟等特性,成为鸿蒙生态后端开发的优选。文章详细演示了环境搭建、基础HTTP服务构建、异步Actor模型实现,并通过性能测试对比了仓颉与Go的表现(仓颉RPS 31,200 vs Go 28,500)。该方案支持鸿蒙设备跨终端通信,提供动态负载均衡与服务发现能力,适用于分布式微服务场景,为开发者提供了鸿蒙生态的高效后端开发新选择。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

【实战指南】OpenClaw 使用 Bird Skill 接入 X(Twitter)的终极省心方案:告别每次都要手动喂 Cookie 的痛苦

OpenClaw 使用 Bird Skill 接入 X(Twitter)的终极省心方案:告别每次都要手动喂 Cookie 的痛苦

hampeter的博客 1802

仓颉语言核心技术全解析与实战教程

深入语言特性:掌握函数式、异步、跨端开发能力。熟悉标准库源码:提高代码复用与扩展能力。实战复盘:通过项目演练巩固知识。第三方库适配:提升开发效率,拓展应用场景。性能优化:优化协程调度、内存与 I/O,保证多端高效运行。

学IT,找陈寒 2008

ENVI5.6+SARscape实战:基于哨兵一号的PS与SBAS时序InSAR地表形变监测全流程解析

本文详细解析了使用ENVI5.6和SARscape软件基于哨兵一号数据进行PS与SBAS时序InSAR地表形变监测的全流程。从数据获取、预处理到PS-InSAR和SBAS-InSAR处理,提供了实用技巧和优化建议,帮助用户高效完成地表形变监测任务。

weixin_29245767的博客 1157

PINN驱动的3D不可压缩流场重建——从稀疏2D2C观测到完整物理场反演——含源码实现

多尺度融合策略在此发挥作用:高分辨率的2D2C数据用于约束平面内的精细结构,而低分辨率的3D3C数据提供第三维度的粗尺度信息。迁移学习架构在此发挥关键作用。这种策略在湍流封闭模型构建中尤为有效,其中RANS提供的平均流场与DNS的雷诺应力数据融合,显著提升了分离流的预测精度。在稀疏数据场景下,注意力权重根据观测数据的分布动态调整,强化数据缺失区域的物理约束,同时避免过拟合于观测点。这种机制与自适应采样的结合,实现了计算效率与重建精度的平衡,在仅保留约百分之十关键节点的情况下,仍能保持高物理一致性。

u012133341的博客 137

http_lib:纯仓颉标准库 HTTP 封装,HTTP/1 + HTTP/2 + HTTP/3

本文介绍了仓颉编程语言社区首个纯标准库实现的HTTP协议封装库http_lib。该库完全基于仓颉标准库开发,零扩展依赖,支持HTTP/1.x、HTTP/2完整协议和HTTP/3类型定义层,提供Server和Client完整能力。项目具有48,000行纯仓颉源码、1576个测试全部通过、32个示例程序,填补了仓颉生态在HTTP通信方面的关键缺口。 http_lib的主要特点包括:纯标准库开发保证兼容性、纯仓颉语法实现提供高质量参考、高性能优化设计、协议覆盖面最广(包括HTTP/2多路复用等特性)。它支持服务端

开源仓颉 408

Virtual Hard Disk version 2 (VHDX) 文件格式详解

VHDX 镜像格式详解 0. References windows github 1. Overview Microsoft 虚拟化产品中常用的映像格式是虚拟硬盘版本 2 (VHDX) 映像格式。该规范基于可用文档,并通过分析测试数据进行了增强。 VHDX 镜像格式种类 固定硬盘镜像 动态硬盘镜像 差异硬盘镜像 VHDX 镜像文件由以下元素构成: file (type) identifier 2x image headers 2x region tables log or metadata journ

圣三一 2697

在鸿蒙HarmonyOS5中使用仓颉实现一个医院手术叫号小程序

/ 手术室数据模型id: number;// 如"第一手术室"// 手术病例模型id: number;: string;endTime?: string;

weixin_63947094的博客 399

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

仓颉经典问题

1.自定义手势识别系统,支持滑动、缩放和旋转手势,通过状态机处理触摸事件;2.WebSocket客户端实现,包含心跳检测和自动重连机制;3.简易ORM框架,支持对象关系映射和CRUD操作;4.图像滤镜处理系统,提供黑白、模糊等滤镜效果;5简易神经网络实现,支持前向传播、反向传播和MNIST数据训练。 每个案例都包含问题描述、实现思路和完整代码,涵盖了前端交互、网络通信、数据库操作、图像处理和机器学习等多个技术领域。

m0_59315734的博客 290

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

鸿蒙网络编程系列46-仓颉版Web组件加载网页的三种方式

本系列的第18篇文章《鸿蒙网络编程系列18-Web组件加载网页的四种方式示例》中,使用ArkTS语言基于API 9环境演示了Web组件四种加载网页内容的方式,其中就包括使用WebviewController的loadData方法直接加载HTML脚本的方式。不过,目前的仓颉版本还不支持loadData方法,因此,本文将基于API 12环境演示Web组件加载网页的其他三种方式。

长弓三石 1253

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

仓颉笔记——写一个简易的web服务并用浏览器打开

创建一个web服务端,同时创建一个客户端去读取这个服务端。也满足浏览器打开web的需求。,然后运行server.exe。

暂时先用这个名字 1206

仓颉开发入门初体验

在刚刚召开的华为开发者大会(HDC 2024)上,华为内部研发已久的国产自主编程语言仓颉终于正式对外官宣!当前在鸿蒙原生应用的开发中,支持声明式 UI 和一次开发、多端部署的 ArkTS 语言已经被广泛使用。仓颉语言作为面向未来的下一代编程语言,当前已经完成设计与实现并启动了开发者预览,未来将与 ArkTS 共同发展,为鸿蒙原生应用开发者提供极致高效的开发体验。同时,仓颉当前在尝试支持AI Native原生智能应用开发、DSL KIT、Actor和分布式编程等。

Sebdhsk的博客 4687

仓颉语言写一个博客网站

提供`/api/articles`接口返回JSON数据(利用标准库的JSON序列化),便于前后端分离开发。println("博客服务已启动:http://localhost:8080")// 7. RESTful API(参考网页4的JSON处理)// 1. 数据结构定义(参考网页4的struct设计)// 3. 增删改查操作(参考网页8的反射注解)// 4. Web服务层(参考网页1的Web服务器示例)// 2. 数据库交互层(参考网页1的数据库操作)// 8. 启动服务(参考网页1的环境配置)

mrzyun0811的博客 1433

Jedi与异步编程:asyncio和async/await的完整支持指南

🚀 在现代Python开发中,异步编程已经成为提升应用性能的关键技术。Jedi作为Python生态中强大的代码补全和静态分析库,对asyncio和async/await提供了全面的支持,让开发者能够更高效地编写异步代码。本文将详细介绍Jedi在异步编程场景下的强大功能和使用技巧。 ## 什么是Jedi?为什么它对异步编程如此重要? Jedi是一个功能强大的Python自动补全、静态分析和重构

gitblog_00506的博客 869

跟Gin一块搭建自己的web框架(三)

在上一篇的基础之上继续实现前缀路由的功能。 首先说明一下这边说的前缀路由的概念。在上一篇的Web服务的基础上,我们对于路由可以有两种处理方式: 一种是所有的路由都挂载到根路径 ‘/’ 上边,举例说明,如果有一个登录和登出功能,我们可以这么来写 router.GET(&quot;/user/login&quot;, loginHandler) router.GET(&quot;/user/logout&quot;, logoutH...

harleylau的博客 786
上一篇: 仓颉编程语言:HTTP 编程
下一篇: 仓颉编程语言:语法节点
懂你的大海
博客等级 码龄6年 9049粉丝 1381原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值