Indy TCP 客户端示例?

Posted

技术标签:

【中文标题】Indy TCP 客户端示例?【英文标题】:Indy TCP client example? 【发布时间】:2015-04-09 02:51:12 【问题描述】:

C++Builder 中是否有 Indy 10 套接字的示例代码?

Indy Demos page 上的两个示例链接是死链接,经过大量搜索,我找不到任何示例代码。

我正在编写一个客户端,它将发送和接收 JSON 消息,不需要复杂的协议或 SSL。

我已经能够根据 TIdTCPClient 的成员函数猜测写id1->Socket->WriteLn 发送一些被服务器接收但尚未弄清楚如何接收服务器响应的东西。

另外,是否有任何 Indy TCP 客户端的概述文档?在一些 Delphi sn-ps 中,我看到使用了 id1.IOHandler.WriteLn,但我没有看到任何解释 IOHandler 的用途、我应该使用哪个、IOHandler.WriteLn 和 Socket.WriteLn 之间有什么区别等。

【问题讨论】:

@RemyLebeau 好的。我看到我第一次在那个演示中走错了路,最后得到了here,它只有 Flash 和 PDF,而不是使用 SVN 链接。该演示仅在 Delphi 中提供,但我猜总比没有好。 【参考方案1】:

Indy Demos page 上的两个示例链接是死链接

该页面上唯一的死链接是 Ralph 的 TIdTCPClient/Server with SSL 演示。其他链接工作正常,包括TCP/IP Delphi&Indy10 Client Server Demo 的链接。

经过大量搜索,我一直找不到任何示例代码。

那么你搜索的不是很好,因为在 Embarcadero 和 Indy 论坛上发布了大量示例,甚至在 *** 上也是如此。

我已经能够根据 TIdTCPClient 的成员函数猜测写id1->Socket->WriteLn 发送一些被服务器接收但尚未弄清楚如何接收服务器响应的东西。

TIdTCPClient 不是异步组件。只有当你告诉它读取时它才会读取。假设您的WriteLn() 正在发送请求,您可以在WriteLn() 退出后立即调用ReadLn()(或任何您想要的读取方法),例如:

id1->Socket->WriteLn("JSON data here");
String response = id1->Socket->ReadLn();

如果您想异步读取响应,请在单独的工作线程中进行读取。

另外,有没有关于 Indy TCP 客户端的概述文档?

官方文档在 Indy 的网站上:

http://www.indyproject.org/Sockets/Docs/index.aspx

http://www.indyproject.org/docsite/html

文档有点旧,尤其是类参考部分,但概述仍然在很大程度上适用。

在一些 Delphi sn-ps 中,我看到使用了 id1.IOHandler.WriteLn,但我没有看到任何解释 IOHandler 的用途、我应该使用哪个、IOHandler.WriteLn 和 Socket.WriteLn 之间的区别等.

提供Socket 属性是为了方便。当IOHandler 属性指向TIdIOHandlerSocket 对象时,Socket 属性返回相同的对象。这避免了对IOHandler 进行类型转换以访问任何特定于套接字的功能的任何需要。 Indy 实现了几个IOHandlers 除了socket I/O,你也可以编写自定义IOHandlers。

IOHandler 完成所有实际工作。在访问任何与 IO 无关的方法时,您应该使用IOHandler 属性而不是Socket 属性,例如WriteLn()ReadLn()。这样,您可以随意换出不同的IOHandler 对象。这很有用,例如,在捕获套接字活动并将其重放以进行调试时。

【讨论】:

Indy TCP 客户端是否支持工作线程读取套接字,而另一个线程同时在同一个套接字上发送? 我的搜索发现您说“在 Embarcadero 和 Indy 论坛,甚至在 *** 上都发布了大量示例。”但我在 EDN 或 SO 上找不到任何此类示例。你能直接链接到他们吗?另外,我在 Indy 论坛上搜索了“TIdTCPClient 示例”,结果似乎都是 q/a 线程,而不是设置示例。 您的文档链接的最新版本是 10.1.5,但是在另一篇文章中我看到您说 XE4 带有 10.6 。 (所以我假设 XE5 至少也有 10.6) 正如我所说,文档有点旧,但它是唯一提供的官方文档。是的,XE5 附带 10.6.0(更高版本)。当前版本是 10.6.2。

以上是关于Indy TCP 客户端示例?的主要内容,如果未能解决你的问题,请参考以下文章

Indy,如何知道所需缓冲区的大小?

使用 TLS 使用来自 DELPHI(Indy) 的 Gmail 传出 SMTP

使用 Indy 的代理服务器

Delphi XE 的 SOAP 服务器和客户端应用程序 VCL+indy 演示?

Indy的TCPServer到底能支持多少个连接

Indy10 Tcp接收数据问题