精易论坛

标题: Websocket消息接收 [打印本页]

作者: Huaz    时间: 2025-4-5 21:23
标题: Websocket消息接收
易语言怎么实现[backcolor=rgba(255, 255, 255, 0.5)]Websocket消息实时接收 有没有大佬分享个例子

作者: xizhihan    时间: 2025-4-5 21:23
wsocket
  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
变量名类 型数组备 注
wsClient类_WSClient_HP  

子程序名返回值类型公开备 注
__启动窗口_创建完毕  
' 初始化HP-Socket环境
HP_初始化 ()
' 创建WebSocket客户Duan
wsClient.创建 ()
wsClient.置接收回调 (&接收回调函数)
' 连接服务器
如果真 (wsClient.连接 ("wss://echo.websocket.events", 443, ) == )
信息框 ("连接失败", 0, , )

子程序名返回值类型公开备 注
接收回调函数  
参数名类 型参考可空数组备 注
连接ID整数型
数据类型整数型  ' 0-文本 1-二进制
数据指针整数型
数据长度整数型
变量名类 型静态数组备 注
接收内容文本型 
' 处理文本消息
如果 (数据类型 == 0)
接收内容 = 指针到文本 (数据指针, 数据长度, )
编辑框1.加入文本 ("收到消息:" + 接收内容 + #换行符 )
' 处理二进制数据(如图片)
字节集数据 = 指针到字节集 (数据指针, 数据长度)

子程序名返回值类型公开备 注
_按钮发送_被单击  
变量名类 型静态数组备 注
消息内容文本型 
消息内容 = 编辑框输入.内容
如果真 (消息内容 ≠ "")
wsClient.发送文本 (消息内容)  ' 发送文本数据
编辑框输入.内容 = ""

子程序名返回值类型公开备 注
__启动窗口_将被销毁  
wsClient.断开 ()
HP_清理 ()

系统api(不推荐)
  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
变量名类 型数组备 注
套接字整数型  

子程序名返回值类型公开备 注
__启动窗口_创建完毕  
套接字 = 创建套接字 ()
连接服务器 ()
子程序名返回值类型公开备 注
连接服务器  
变量名类 型静态数组备 注
服务器地址文本型 
服务器端口整数型 
服务器地址 = "echo.websocket.events"
服务器端口 = 80
如果真 (连接套接字 (套接字, 服务器地址, 服务器端口) == )
信息框 ("连接失败", 0, , )
返回 ()

' 发送WebSocket握手请求
发送数据 (套接字, 生成握手请求 (服务器地址, 服务器端口))
' 启动接收线程
启动线程 (&接收数据线程, , )
子程序名返回值类型公开备 注
生成握手请求  
参数名类 型参考可空数组备 注
主机文本型
端口整数型
变量名类 型静态数组备 注
握手请求文本型 
握手请求 = "GET / HTTP/1.1" + #换行符 +
"Host: " + 主机 + ":" + 到文本 (端口) + #换行符 +
"Upgrade: websocket" + #换行符 +
"Connection: Upgrade" + #换行符 +
"Sec-WebSocket-Key: " + 取随机Base64密钥 () + #换行符 +
"Sec-WebSocket-Version: 13" + #换行符 +
#换行符
返回 (握手请求)
子程序名返回值类型公开备 注
接收数据线程  
变量名类 型静态数组备 注
缓冲区字节集 
数据长度整数型 
判断循环首 ()
数据长度 = 接收数据 (套接字, 缓冲区)
如果真 (数据长度 ≤ 0)
断开连接 ()
跳出循环 ()

' 解析WebSocket数据帧
解析WebSocket帧 (缓冲区)
判断循环尾 ()
子程序名返回值类型公开备 注
解析WebSocket帧  
参数名类 型参考可空数组备 注
数据帧字节集
变量名类 型静态数组备 注
opcode整数型 
有效数据字节集 
' 解析第一个字节
opcode = 位与 (数据帧 , 0x0F)
判断 (opcode == 1)  ' 文本帧
有效数据 = 解码WebSocket数据 (数据帧)
编辑框1.加入文本 ("收到消息:" + 到文本 (有效数据) + #换行符 )
判断 (opcode == 2)  ' 二进制帧
' 处理二进制数据

子程序名返回值类型公开备 注
解码WebSocket数据  
参数名类 型参考可空数组备 注
数据帧字节集
变量名类 型静态数组备 注
掩码键字节集 
数据长度整数型 
结果数据字节集 
' 解析数据长度
数据长度 = 位与 (数据帧 , 0x7F)
如果 (数据长度 == 126)
数据长度 = 取字节集数据 (取字节集中间 (数据帧, 3, 2), #短整数型, )
.否则如果 (数据长度 == 127)
数据长度 = 取字节集数据 (取字节集中间 (数据帧, 3, 8), #长整数型, )

' 获取掩码键
掩码键 = 取字节集中间 (数据帧, 6, 4)
' 解码数据
结果数据 = 取字节集中间 (数据帧, 10, 数据长度)
计次循环首 (取字节集长度 (结果数据), i)
结果数据 [i] = 位异或 (结果数据 [i], 掩码键 [ (i - 1) % 4 + 1])
计次循环尾 ()
返回 (结果数据)


作者: 忆思梦    时间: 2025-4-5 21:27
.版本 2
.支持库 spec

.子程序 __启动窗口_创建完毕
.局部变量 http回调函数, 整数型
.局部变量 WebSocket回调函数, 整数型
.局部变量 Tcp回调函数, 整数型
.局部变量 错误信息, 文本型

' Sunny中间件  在模块中已是全局变量,直接使用即可
Sunny中间件.绑定端口 (2022)

http回调函数 = 0
WebSocket回调函数 = 到整数 (&__示例__WebSocket回调函数)
Tcp回调函数 = 0

Sunny中间件.绑定回调地址 (http回调函数, Tcp回调函数, WebSocket回调函数)
' Sunny中间件.设置IE代理 ()  ' 设置IE代理
' Sunny中间件.关闭IE代理 ()'取消IE代理

.如果 (Sunny中间件.启动 ())
    .如果真 (Sunny中间件.安装证书 (错误信息) = 假)
        信息框 (“自动安装证书到系统失败,请手动安装证书!” + #换行符 + #换行符 + 错误信息, 0, “证书安装失败”, )
    .如果真结束
    ' 安装证书请阅读:http://esunny.vip/ 中的 [Sunny网络中间件-示例文档]->[(教程)安装证书]
    信息框 (“启动成功”, 0, , )

.否则
    信息框 (Sunny中间件.取错误 (), #错误图标, “启动失败”, )
.如果结束


.子程序 __示例__WebSocket回调函数, , 公开
.参数 SunnyContext, 整数型, , Sunny中间件可创建多个 由这个参数判断是哪个Sunny回调过来的
.参数 请求唯一ID, 整数型
.参数 MessageId, 整数型
.参数 消息类型, 整数型, , #Sunny_消息类型_
.参数 Method, 文本型
.参数 Url, 文本型
.参数 pid, 整数型, , 进程PID 若等于0 表示通过代理远程请求 无进程PID
.参数 WsMsgType, 整数型, , ws/wss 发送或接收的消息类型 请使用[ #Sunny_WsMessage_]

' ws 测试地址  http:// coolaf.com/tool/chattest
' wss 测试地址  https:// www .idcd.com/tool/socket
' ===========================================
' 相关命令
' Sunny函数.ws_发送数据 (发送方向,请求唯一ID, WsMsgType, 到字节集 (“123456”)) ' 主动发送消息 可在任意位置调用
' Sunny函数.ws_断开指定连接 (请求唯一ID) ' 主动发送消息 可在任意位置调用

.判断开始 (消息类型 = #Sunny_Websocket_消息类型_连接成功)

    调试输出 (“Websocket 建立连接”, Url)

.判断 (消息类型 = #Sunny_Websocket_消息类型_发送数据)

    调试输出 (“Websocket 发送数据”, Url)
    ' 相关命令
    ' Sunny函数.ws_取Body长度 (MessageId) ' 取要发送数据的长度
    ' Sunny函数.ws_取Body (MessageId)  ' 取出要发送的数据
    ' Sunny函数.ws_修改Body (MessageId, {  }) '将要发送的数据修改为 空

.判断 (消息类型 = #Sunny_Websocket_消息类型_收到数据)

    调试输出 (“Websocket 收到数据”, Url)
    ' 相关命令
    ' Sunny函数.ws_取Body长度 (MessageId) ' 取要发送数据的长度
    ' Sunny函数.ws_取Body (MessageId)  ' 取出要发送的数据
    ' Sunny函数.ws_修改Body (MessageId, {  }) '将要发送的数据修改为 空

.判断 (消息类型 = #Sunny_Websocket_消息类型_断开连接)

    调试输出 (“Websocket 断开连接”, Url)
.默认

.判断结束
返回 ()
作者: 忆思梦    时间: 2025-4-5 21:29
忆思梦 发表于 2025-4-5 21:27
.版本 2
.支持库 spec

SunnyNet网络中间件【更新】2025-01-27
https://125.confly.eu.org/forum.php?mod=viewthread&tid=14847096
(出处: 精易论坛)
用秦天大佬的sunny模块
作者: Huaz    时间: 2025-4-5 21:33
忆思梦 发表于 2025-4-5 21:29
SunnyNet网络中间件【更新】2025-01-27
https://125.confly.eu.org/forum.php?mod=viewthread&tid=14847096
(出 ...

ws链接ws://localhost:3001/get_msg?access_token=
监听该链接到编辑框中 怎么操作知道吗大佬方便给个示例吗
作者: Huaz    时间: 2025-4-5 21:42
如何监听ws://localhost:3001/get_msg?access_token= 内容返回 编辑框
作者: 忆思梦    时间: 2025-4-5 22:07
大概写了一下,模块和dll的话自行下载就行了
SunnyNet网络中间件【更新】2025-01-27
https://125.confly.eu.org/forum.php?mod=viewthread&tid=14847096

demo.e

56.46 KB, 下载次数: 20


作者: 王不饿    时间: 2025-4-5 22:58
E2EE支持库也可以
作者: 熬夜    时间: 2025-4-17 13:33
1111111111111




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4