
TiXL 网络集成实战Lib.io.tcp 中的 TcpClient 与 TcpServer 操作符详解【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3TiXLTooll eXpressive Language的Lib.io.tcp分类为实时动态图形项目提供了基于 TCP 协议的双向通信能力TcpClient负责连接远程 TCP 服务器以收发数据TcpServer则在本地开启监听端口以接收多个客户端连接并向其广播消息。阅读本文后你将掌握这两个操作符的完整输入/输出参数语义、自动发送与手动触发两种发送模式、局域网内的联机调试方法以及源码层面的连接管理、接收循环与消息广播机制。Lib.io.tcp是 TiXL 操作符库中Lib.io输入/输出家族的一员其官方文档索引位于 .help/docs/operators/lib/io/tcp/README.md包含以下两个操作符TcpClient连接一个 TCP 服务器用于发送与接收数据。TcpServer创建一个 TCP 服务器监听入站连接并接收数据。两者的实际实现分别位于 Operators/Lib/Symbols/io/tcp/TcpClient.cs 与 Operators/Lib/Symbols/io/tcp/TcpServer.cs同目录下的.t3与.t3ui文件则是它们在操作符库中的符号定义与界面配置。一、TcpClient连接远程服务器并收发数据TcpClient 操作符建立一条指向指定 TCP 服务器的客户端连接。它可以发送由多个部件拼接而成的消息同时接收服务器回传的数据——接收到的数据既可以作为连续字符串输出也可以整理为按行每条消息排列的字符串列表。1.1 输入参数名称相关度与类型说明源码默认值ConnectBoolean打开或关闭到 TCP 服务器的连接falseHostString要连接的 TCP 服务器 IP 地址或主机名如127.0.0.1或localhostlocalhostListLengthInt32ReceivedLines输出列表中最多保存的接收消息条数10源码中会被限制在1~1000区间MessagePartsString一组字符串或值拼接后构成要发送的消息多输入槽MultiInputSlotPortInt32目标 TCP 服务器的端口号8080PrintToLogBoolean开启后把状态信息、收发数据与错误打印到 T3 日志便于调试falseSendOnChangeBoolean开启后MessageParts内容发生变化即自动发送消息trueSendTriggerBoolean手动发送触发该值从 0 变到 1 时发送消息falseSeparatorString拼接MessageParts时使用的分隔字符串 空格LocalIpAddressString本地网卡绑定地址配合下拉框选择可用网卡0.0.0.0 (Any)1.2 输出名称类型IsConnectedSystem.BooleanReceivedLinesSystem.Collections.Generic.List1[System.String]ReceivedStringSystem.StringWasTriggerSystem.Boolean1.3 官方使用提示使用SendOnChange可在MessageParts输入变化时自动发送数据需要手动控制发送时使用SendTrigger输入发送前先检查IsConnected输出确认连接状态。1.4 源码行为补充从 TcpClient.cs 的实现中可以确认如下细节消息构建HandleMessageSending方法通过string.Join(separator, messageParts)把所有MessageParts子输入按Separator拼接成一条完整消息TcpClient.cs 第 125-143 行。发送条件为“已连接”且手动触发 或 内容变化且开启了SendOnChange且消息非空。触发自动复位手动触发发送后源码会调用SendTrigger.SetTypedInputValue(false)把触发输入复位为false这样同一触发值不会重复发送。接收与行列表HandleReceivedMessages把每条新消息依次推入历史ListLength通过.Clamp(1, 1000)限制历史条数ReceivedLines输出完整的历史列表而ReceivedString只输出最近一条TcpClient.cs 第 145-163 行。WasTrigger在当帧有新消息到达时为true可作为“收到数据”的事件信号。编码与缓冲接收循环使用 8192 字节缓冲区、按 UTF-8 解码Encoding.UTF8.GetString收到 0 字节表示远端关闭连接并自动停止TcpClient.cs 第 260-315 行。本地绑定当LocalIpAddress被指定为具体 IP 时连接会通过new TcpClient(new IPEndPoint(localIp, 0))绑定到该本地地址默认的0.0.0.0 (Any)则不指定本地地址TcpClient.cs 第 379-397 行。状态反馈操作符实现了IStatusProvider连接中、已连接、连接失败、断开等状态会通过状态提示展示开启PrintToLog后还会以TCP Client → 消息、TCP Client ← 消息的形式记录发送与接收内容TcpClient.cs 第 424-436 行。二、TcpServer本地监听、多客户端接收与广播TcpServer 操作符在指定的 IP 地址与端口上启动一个 TCP 服务器允许多个客户端同时连接。它会接收所有已连接客户端的数据并能把消息广播给全部客户端。2.1 输入参数名称相关度与类型说明源码默认值ListenBoolean启动或停止 TCP 服务器的监听falseLocalIpAddressString服务器监听的本地 IP。下拉框会列出可用地址使用0.0.0.0将监听所有网络接口0.0.0.0MessageString要广播给所有已连接客户端的消息空字符串PortInt32服务器监听的端口号8080PrintToLogBoolean开启后把状态信息、连接事件、收发数据与错误打印到 T3 日志便于调试falseSendOnChangeBoolean开启后Message内容变化即自动发送给所有客户端trueSendTriggerBoolean手动向所有已连接客户端广播Message的触发该值从 0 变到 1 时发送false2.2 输出名称类型ConnectionCountSystem.Int32IsListeningSystem.BooleanResultT3.Core.DataTypes.Command2.3 官方使用提示使用Listen启停服务器ConnectionCount显示当前已连接的客户端数量通过Message输入发送的消息会广播给所有已连接客户端。2.4 源码行为补充从 TcpServer.cs 的实现中可以确认如下细节多客户端管理服务器使用ConcurrentDictionaryGuid, TcpClient为每个接入的客户端分配一个GuidAcceptConnectionsLoop通过AcceptTcpClientAsync持续接受新连接并为每个客户端启动独立的HandleClient任务读取数据TcpServer.cs 第 174-276 行。广播机制BroadcastMessageAsync会把Message以 UTF-8 编码后逐个写入所有已连接客户端的流某个客户端发送失败不会影响其余客户端TcpServer.cs 第 278-308 行。地址处理LocalIpAddress为空或等于0.0.0.0 (Any)时使用IPAddress.Any监听所有网卡若填入了无法解析的 IP会给出警告状态并回退到IPAddress.AnyTcpServer.cs 第 127-172 行。连接计数与监听状态ConnectionCount直接读取客户端字典的CountIsListening反映监听器是否存在两者均带脏标记触发客户端接入/断开时会即时更新TcpServer.cs 第 105-106 行。断开清理客户端正常断开或异常退出时都会从字典中移除并释放连接服务器停止时也会统一释放全部客户端与监听器TcpServer.cs 第 310-360 行。三、网卡下拉框LocalIpAddress 的交互实现两个操作符都实现了ICustomDropdownHolder接口为LocalIpAddress输入提供下拉选项TcpClient.cs 第 468-486 行、TcpServer.cs 第 398-416 行下拉列表通过NetworkInterface.GetAllNetworkInterfaces()枚举当前处于Up状态、非回环的 IPv4 网卡并固定附带Any0.0.0.0与Localhost127.0.0.1两个选项每个网卡选项以“网卡名: IP 地址”的形式展示如Ethernet: 192.168.1.100选中某个网卡后操作符会把对应的 IP 写入LocalIpAddress输入后续重连即绑定该地址。这一交互让用户无需手动记忆本机 IP 即可在多个网卡之间切换绑定目标也简化了局域网联机时的配置。四、实战接线示例以下为基于上述参数语义的典型接线方式TiXL 采用节点式连线参数即为操作符节点上的输入/输出端口场景一客户端向局域网服务器发送控制消息在图中加入TcpClient设置Host为服务器 IP如192.168.1.50、Port为服务器监听端口把Connect置为true等待IsConnected变为true向MessageParts添加若干字符串/数值子输入并用Separator指定分隔符默认空格开启SendOnChange默认开启即可在参数变化时自动发送需要固定节奏或按键触发时改用SendTrigger的 0→1 跳变手动发送服务器回传的数据会出现在ReceivedString最近一条或ReceivedLines最近 N 条列表中WasTrigger可驱动后续节点响应新消息。场景二本地接收并转发到画面/日志加入TcpServerLocalIpAddress保持0.0.0.0或从下拉框选择具体网卡Port设置为未被占用的端口将Listen置为true观察IsListening变为true、ConnectionCount随客户端接入递增把外部工具如自研控制器、传感器程序作为 TCP 客户端连接到该地址与端口服务器收到数据后按 UTF-8 解码调试时开启PrintToLog即可在 T3 日志中看到类似TCP Server ← 消息 from client Guid的记录。场景三服务器端广播将需要下发的值接到Message输入开启SendOnChange后内容变化即广播给所有已连接客户端若多个客户端需要同时收到状态更新如演出控制指令这是最直接的方式。五、与其他网络操作符的选型对比Lib.io分类下除 TCP 外还提供 UDPOperators/Lib/Symbols/io/udp 中的UdpInput/UdpOutput、WebSocketOperators/Lib/Symbols/io/websocket 中的WebSocketClient/WebSocketServer以及 HTTPOperators/Lib/Symbols/io/http 中的WebServer等网络能力。选择建议TCP需要可靠、有序、双向的长连接通信且对每条消息的收发状态有明确感知IsConnected、ConnectionCount、WasTrigger时选用本文两个操作符已覆盖客户端与服务器两端。UDP面向无连接的广播/组播场景追求低延迟、可容忍少量丢包时选用。WebSocket需要与浏览器端网页交互、或消息需经过 HTTP 代理环境时选用。若需与其他支持 OSC 的控制器/软件互通可参考 .help/docs/using/OSC.md 了解 OSC 协议在 TiXL 中的用法。六、常见问题与调试要点连接失败/无法监听先确认端口未被占用、防火墙放行TcpServer填错 IP 时会回退到0.0.0.0并显示警告状态注意核对LocalIpAddress下拉框中的实际网卡。发送无效果检查IsConnected客户端或IsListening服务器输出TcpClient的发送还会被Separator与空消息过滤影响拼接结果为空时不会发送。消息收不到开启PrintToLog观察日志中的←/→收发记录客户端接收按 TCP 流式读取数据到达即推入ReceivedString并更新ReceivedLines注意ListLength只保留最近 N 条历史。触发重复发送SendTrigger采用 0→1 跳变触发且触发后自动复位应避免持续保持高电平而是使用脉冲式跳变。清理与释放操作符被删除或项目关闭时会异步停止连接/监听并释放套接字无需手工干预但长期不使用的连接建议显式把Connect/Listen置回false避免占用端口。以上行为均可对照源码 TcpClient.cs 与 TcpServer.cs 进一步验证如需了解 TiXL 操作符开发的通用约定可参阅 .help/docs/advanced/CreatingNewOps.md。【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考