Socket客户端使用指导

← 返回Socket客户端组件参考 · 全部使用指导

Socket客户端使用指导

TCP Socket 客户端组件。

该组件用于主动连接远程 Socket 服务端,并提供文本或二进制数据的发送能力。 连接建立后会在后台线程持续监听服务端返回的数据,再通过事件把结果切回主线程抛给积木层。

Socket 客户端现已作为原生组件提供,新项目无需导入拓展;使用旧拓展的项目请先备份,再按原生组件迁移。

快速上手

  1. 拖一个 Socket客户端 到屏幕,属性面板填好服务器地址与端口;
  2. 搭下面的代码块:连上就打招呼,收到什么就显示什么。

各案例独立使用;组合到同一屏幕时,将同名事件的处理合并到一个事件积木中。

when Socket客户端1.Connected() {
  Socket客户端1.SendText("hello\n")
}

when Socket客户端1.MessageReceived(消息) {
  标签1.Text = 消息
}

when Socket客户端1.ConnectFailed(消息) {
  标签1.Text = join("连接失败:", 消息)
}

发送文本时通常在末尾加换行符 \n(Windows 风格的服务端用 \r\n),方便服务端按行读取。

和单片机、工控设备收发二进制协议帧时,用发送字节数组(字节列表)(SendBytes)发、收到字节时(字节列表)(BytesReceived)收, 配合二进制组件拼包、算校验、解析数字、把十六进制文本转成字节。完整做法见二进制数据专题。

搭建与测试

在设计器拖入本组件和案例涉及的按钮、标签、布局等组件,按案例中的名称重命名。先运行最小案例,确认事件返回,再增加业务逻辑。示例中的素材先上传到项目,服务器地址、令牌、文件路径换成自己的值。

可见组件需要有非零宽高;不可见工具组件必须由属性或方法启动。设计器展示样式不等于运行时已加载数据或绑定目标。联机测试应使用包含本组件的 AI 伴侣;涉及系统入口或权限的行为还要编译安装后验证。

案例:主动连接与断开

放连接、断开按钮和标签,属性面板配置真实 TCP 服务器地址与端口。该服务器必须接受原始 TCP,不能填 WebSocket 网址。

when 按钮_连接.Click() {
  Socket客户端1.Connect()
}
when 按钮_断开.Click() {
  Socket客户端1.Disconnect()
}
when Socket客户端1.Disconnected() {
  标签1.Text = "连接已断开"
}

TCP 接收块不保证恰好是一条业务消息;协议应规定换行、固定长度或长度前缀,应用按协议拼接拆分。

属性、方法与事件速查

完整参数类型、默认值和平台说明见组件参考。下表按调用入口列出用途;有完成事件的方法在事件中读取结果。

入口 用途
连接状态(ConnectionState) 连接状态 - true = 已连接;false = 已断开连接
服务器地址(ServerAddress) 客户端将连接到的服务器的地址。
服务器端口(ServerPort) 客户端将连接到的服务器的端口。
超时毫秒(TimeoutMs) 服务器连接超时时间(毫秒)
连接(Connect) 异步尝试连接服务器,连接成功后启动线程接收数据。
断开连接(Disconnect) 断开与服务器的连接。
发送字节数组(字节列表)(SendBytes) 向服务端发送二进制数据,参数是字节列表(0~255 的数字,负数按补码)。例:[165, 1, 255] 发出 A5 01 FF 三个字节;文本框里输入的十六进制「A501FF」要先用二进制组件的「十六进制转字节」转成字节列表。
发送文件(文件名)(SendFile) 把整个文件按原始字节直接发送到服务器(文本/图片等任意文件均可,不做任何转换)。
发送文本(文本)(SendText) 以文本(UTF-8)发送数据到服务器。二进制协议帧请用「发送字节数组」。
收到字节时(字节列表)(BytesReceived) 当后台接收线程读取到服务端数据后触发,「字节列表」为这次收到的原始字节(0~255 的数字),例:设备发来 A5 01 FF 得到 [165, 1, 255],用二进制组件的「字节转十六进制」可显示成「A5 01 FF」。与「收到消息时」同时触发。一帧数据可能分几次到达,也可能几帧一起到达,需要时先接到一个全局列表里再按帧头和长度拆。
连接失败时(消息)(ConnectFailed) 当异步连接失败时触发,message 参数会给出失败原因。
已连接时(Connected) 当异步连接成功建立后触发,表示当前可以安全开始发送数据。
已断开时(Disconnected) 当本地主动调用 Disconnect 并成功释放连接资源后触发。
文件发送失败时(文件名,消息)(FileSendFailed) 文件发送失败时触发(未连接、文件不存在、连接中断等),message 给出失败原因。
文件发送进度更新时(文件名,已发送字节数,总字节数)(FileSendProgress) 文件发送过程中周期性触发(按百分比推进,最多约 100 次),bytesSent 为已发送字节数,totalBytes 为总字节数。
文件发送完成时(文件名,已发送字节数)(FileSent) 文件全部发送完成后触发;需要在文件后追加结束符等协议内容的,可在本事件中继续调用「发送文本」。
收到消息时(消息)(MessageReceived) 当后台接收线程读取到服务端数据后触发,数据按 UTF-8 转成文本。要原始字节请用「收到字节时」。
远端连接关闭时(RemoteConnectionClosed) 当远端主动关闭连接或连接在接收过程中被远端中断时触发。

常见问题与验收

检查项 操作与预期
初始化 对照案例检查是否已经调用加载、注册、连接或显示方法;仅拖入组件不会替你执行这些步骤。
结果返回 将成功事件和失败事件都接到标签,记录事件参数;异步操作完成前不读取结果属性。
输入配置 检查素材名大小写、网址是否为直接资源地址、文件是否存在、编号和索引是否在范围内。
平台与权限 按组件参考中的平台说明测试;授权被拒绝时应有明确提示,不继续假定操作成功。
最小案例 先验证页面中的最小案例,再验证第二个场景;重复操作、取消、返回屏幕后结果应符合事件说明。

完整 .aia 源码与操作指导

下载 .aia 源码

需要手机与电脑在同一局域网,先运行随页提供的TCP回显服务。所有收发用实际Socket;TCP没有消息边界,一次发送可能分多次接收,本页展示每次真实字节片段,不把一个接收事件当成整帧。测试文件在应用私有目录创建。

导入 SocketClientAllFeatures.aia,连接最新伴侣,或编译独立安装包。真机/伴侣运行尚未实测。

API / 功能 操作入口 预期结果
三个设计器设置、ServerAddress / ServerPort / TimeoutMs 读写 填电脑实际IP、8766、5000,点连接/属性 真实连接事件反馈;地址是电脑IP,不是手机回环地址
Connect / Connected / ConnectFailed / ConnectionState 正确地址连接,再断开并改错误端口重试 成功或具体失败原因;状态查询来自组件
SendText / MessageReceived 点发送文本 手机显示回显片段,电脑显示真实收到的UTF-8字节
SendBytes / BytesReceived 点发送字节 回显 A5 01 02 DC 05,原始字节不经UTF-8替换
SendFile / FileSendProgress / FileSent 创建测试文件后点发送文件 展示实际进度与字节数,电脑显示内容;完成仅表示写入连接
FileSendFailed 已连接时点错误文件 返回真实文件失败事件,可继续发送
RemoteConnectionClosed / Disconnected / Disconnect 点远端关闭,重连后点断开 电脑主动关闭与客户端主动断开可区分,可多次重连

所有返回值均用于界面反馈,错误由底部错误区展示。设计器采用明确非默认配置,初始化与界面同步。API 覆盖检查按最终 AIA 检查方法、事件、属性读取与设置及设计器配置,不能替代真实设备验证。

TCP通信

导入方法:项目 → 导入项目(.aia)→ 选择下载的 .aia 源码文件。 需要手机与电脑在同一局域网,先运行随页提供的TCP回显服务。所有收发用实际Socket;TCP没有消息边界,一次发送可能分多次接收,本页展示每次真实字节片段,不把一个接收事件当成整帧。测试文件在应用私有目录创建。 覆盖检查 24/24。首次载入及保存重开均0个错误,真实后台导入、安装包编译通过;真机/伴侣/硬件联调尚未实测。全部属性读写、方法与事件的操作入口和预期结果见组件指导。

电脑端完整代码

手机与电脑连接同一个局域网,把下面代码保存为 tcp-peer.py。启动命令如下(Windows把 .venv/bin/python 改为 .venv\Scripts\python.exe):

python3 tcp-peer.py
#!/usr/bin/env python3
"""实际TCP回显对端:接收文本、二进制和文件原始字节;CLOSE换行请求关闭。"""
import socketserver

class 回显处理器(socketserver.BaseRequestHandler):
    def handle(self):
        print("连接:", self.client_address, flush=True)
        尾部 = b""
        while True:
            数据 = self.request.recv(65536)
            if not 数据:
                return
            if b"CLOSE\n" in 尾部 + 数据:
                print("按客户端请求关闭", flush=True)
                return
            尾部 = (尾部 + 数据)[-5:]
            print("收到", len(数据), "字节:", 数据.hex(" ").upper(), flush=True)
            self.request.sendall(数据)

class 回显服务(socketserver.ThreadingTCPServer):
    allow_reuse_address = True
    daemon_threads = True

if __name__ == "__main__":
    with 回显服务(("0.0.0.0", 8766), 回显处理器) as 服务:
        print("TCP已监听8766;手机填写电脑局域网IP,Ctrl+C结束。", flush=True)
        try:
            服务.serve_forever()
        except KeyboardInterrupt:
            pass

电脑监听地址 0.0.0.0 表示接受局域网连接;手机连接地址必须是电脑实际局域网IP,不是 0.0.0.0 或手机自己的 127.0.0.1。允许本机防火墙对应TCP端口。若失败先核对服务终端和两端网络,修正后再连接。

电脑脚本本机协议回显检查见案例验证记录;手机硬件与真实网络尚未联调。

反复连接与断开

Disconnect 在后台关闭连接。不要在同一个按钮事件里紧接着执行 Connect;等 Disconnected 后再连接。连接中或已经连接时重复调用 Connect 会报错,并不会建立第二条连接。

重连时应允许发送按钮在新的 Connected 之后才可用;服务器主动关闭时等待 RemoteConnectionClosed,再由用户重试。当前本机测试覆盖同一客户端连续10轮断开重连,以及远端关闭后的重连收发;这些结果不替代旧版第三方扩展或手机运行验证。

文档反馈