Indy 10.x 使用TCPClient发送与接收消息实战

1星 需积分: 50 39 下载量 105 浏览量 更新于2024-09-03 收藏 3KB TXT 举报
" Indy 10.x 中使用 TCP 客户端发送消息并立即接收的 Delphi 技术实现" 在 Delphi 开发环境中, Indy 10 是一个流行的网络通信库,它提供了多种协议的支持,包括 TCP。在这个场景中,我们关注的是如何使用 `TIdTCPClient` 组件来发送消息并及时接收回应。`TIdTCPClient.IOHandler.Write` 方法用于发送数据,而确保正确接收回应则需要正确设置和管理通信流程。 首先,我们需要了解 `TIdTCPClient` 的基本使用方法。在 `btnConnClick` 事件处理程序中,可以看到对 `TIdTCPClient` 的配置,包括设置主机名(`Host`)、端口号(`Port`)以及连接和断开连接的操作。在尝试连接之前,如果 `TIdTCPClient` 已经处于活动状态,则需要先关闭连接并清除绑定。 ```delphi if IdTCPClient.Connected then IdTCPClient.Disconnect; IdTCPClient.Host := ClientIP; IdTCPClient.Port := Port; IdTCPClient.Connect; ``` 然后,我们看到一个特定的命令(握手命令)被构造并发送出去。这个命令由一系列字节组成,表示 FINS(Fujitsu Integrated System Protocol)协议的一部分。握手命令通常用于确认客户端与服务器之间的连接,并可能触发服务器的响应。在这种情况下,握手命令的长度是固定的12字节,由数组 `cmd` 表示。 ```delphi SetLength(cmd, 20); cmd[0] := $46; // FINS cmd[1] := $49; cmd[2] := $4E; cmd[3] := $53; // ... cmd[8] := $00; // ... 等等 ``` 发送命令使用 `TIdTCPClient.IOHandler.Write`: ```delphi IdTCPClient.IOHandler.Write(cmd, 0, Length(cmd)); ``` 发送命令后,为了能够接收服务器的回应,我们需要监听 `TIdTCPClient.IOHandler` 上的 `OnWork` 或 `OnRead` 事件。这些事件会在数据可用时触发,我们可以在这两个事件的处理函数中读取接收到的数据。例如: ```delphi procedure TForm1.IdTCPClient1IOHandlerWork(ASender: TIdPeerThread; AWorkMode: TIdWorkMode; AWorkCount: Int64); begin if ASender.InputBuffer.Size > 0 then begin SetLength(reci, ASender.InputBuffer.Size); ASender.InputBuffer.ReadBytes(reci[1], ASender.InputBuffer.Size); Memo1.Lines.Add(reci); // 可能需要进一步解析或处理收到的数据 end; end; ``` `TIdTCPClient.IOHandler.ReadBytes` 方法用于从输入缓冲区读取数据,将其转换为字符串,并存储在 `reci` 变量中。这里,我们简单地将接收到的数据添加到 memo 控件中显示,实际应用中可能需要进行解码或解析。 Indy 10.x 中的 `TIdTCPClient` 提供了与远程服务器进行 TCP 通信的能力。通过设置连接参数、发送自定义命令以及监听接收事件,我们可以构建一个完整的双向通信机制。在 Delphi XE 环境下,开发者可以利用 Indy 库轻松地实现类似功能,以满足不同网络通信需求。