问题标签 [indy10]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
5654 浏览

delphi - 当客户端连接到 Indy 中的服务器时,为什么 IOHandler.ReadStream 会阻塞线程?

今天,我在使用 Indy 10(随 Delphi 2010 提供)时遇到了一个奇怪的行为。这是问题所在:

假设我们的客户端中有一个 IdTcpClient,我们的服务器应用程序中有一个 IdTcpServer,并且我们的 IdTcpServer 的 OnExecute 事件处理程序中的这段代码:

现在,当客户端尝试连接到服务器时,使用 TIdTcpClient.Connect;在服务器上,调用 TIdTcpServer.OnExecute,当执行到达 AContext.Connection.IOHandler.ReadStream(AStream) 行时,在 OnExecute 事件处理程序中运行的线程被阻塞!

当我跟踪代码时,问题是在 ReadStream 中调用 ReadLongInt 以获取字节数引起的。ReadLongInt 调用 ReadBytes。在 ReadBytes 中,FInputBuffer.Size 为零。在那里,在一个循环中调用 ReadFromSource,最终执行到达 TIdSocketListWindows.FDSelect,它从 WinSock2 调用“select”函数,并且执行在这里停止,并且不会从该客户端连接接收任何内容。我也尝试为 AByteCount 和 AReadUntilDisconnect 参数赋值,但它并没有改变行为。

如果我将 ReadStream 替换为 ReadLn,则连接到服务器不会阻止代码执行,并且从客户端发送的数据由服务器读取。

代码有什么问题吗?或者这是一个错误?

问候

0 投票
1 回答
1342 浏览

delphi - 如何处理网络掉线和 Indy IdTCPServer

我已经使用 IdTCPServer 组件创建了一个客户端/服务器应用程序。客户端在应用程序的整个生命周期内连接并保持持久连接。如果网络连接断开(这种情况经常发生,因为客户端使用无线网络卡连接),客户端将自动重新连接。这一切都很好。

我的问题是处理与丢失连接对应的服务器上的套接字。他们不会检测到网络丢失并自行断开连接。在阅读了几篇相关文章后,我了解到服务器无法知道连接是否断开。它必须等待某个事件才能发现这一点。

所以我的问题是,我是否应该在我的服务器中构建一些机制来定期“处理”连接断开的套接字?如果是这样,怎么办?我认为一种方法是循环遍历所有连接并尝试向它们发送数据。我发现这将触发所需的“事件”。

0 投票
1 回答
478 浏览

delphi - 无状态 HTTP 会话中的进度反馈

我需要编写一个无状态服务器来执行远程方法。客户端使用带有 JSON 参数的 REST 来传递方法名称及其参数。服务结果后,会话关闭。我必须使用 Indy10、TCP/IP 作为协议,因此考虑使用 IdHTTPServer。

大型结果集由 Indy10 分块并分部分发送给客户端。

我现在的问题是:

如果服务器上的方法需要更长的时间才能产生结果,则它们会提供进度信息。这些是短消息。我怎样才能回信给客户?

到目前为止,我已经writeflush在服务器上使用过,但是客户端在返回完整的结果集(包括进度信息)之前等待请求结束。我该怎么做才能在客户端上显示/处理此类进度信息,同时保持连接打开以接收同一请求的更多数据?

0 投票
1 回答
1831 浏览

multithreading - tidtcpserver.active 上的死锁 = false (Delphi2007/indy10)

我遇到了一些由现已离开我们公司的开发人员编写的代码的问题,该代码实现了一个响应基于 XML 的协议的 tcpserver。这似乎在我们的测试环境中工作得非常好,但是一两个客户在应用程序关闭时遇到了问题。

我已经将此追溯到调用 tidtcpserver.active = false 时似乎出现的死锁。我已经知道死锁可能是由一个连接线程对主线程进行同步调用而导致的,而主线程正在等待连接线程终止。

我已经在使用 tidthreadsafestringlist 将数据传递给主线程进行处理,并且我需要从主线程调用一个过程,我已经创建了一个 tidnotify 后代来执行此操作。谁能想到其他要寻找的东西。


我已经在检查异常处理,

这就是我在 onexecute 事件中所拥有的

结尾;


这是我使用 TS-stringlist 的方式

宣言。

它在构造函数中创建并在析构函数中销毁。

这就是我在 tcpserver 的上下文中添加它的方式。

这就是我在主应用程序线程的上下文中读取它的方式

我认为这是使用它的正确方法,但我等待您的意见。

0 投票
2 回答
2253 浏览

delphi - tIdHttpServer - EidConnClosed 在向 POST 发送回复之前关闭

我在 delphi 2007 中使用 indy 10 实现 HTTP 服务器时遇到问题。

我为 CommandGet 事件设置了一个简单的事件处理程序。

在回复使用 GET 方法发送的数据时,我可以解析参数并将 XML 数据发送回来,没有任何问题。(见下面的代码)

当我尝试回复使用 POST 发送的数据时,indy 永远不会发送响应,而是由 TIdIOHandler.WriteDirect 从 CheckForDisconnect(True, True) 行引发 EidConnClosedGracefully。这是我如何处理传入的 POST 数据

我已经使用wireshark查看发生了什么,看起来indy在发送响应之前发送了一个ACK并导致客户端断开连接。

为了测试这一点,我用 PHP 设置了 Apache 并编写了一个 PHP 脚本来做同样的工作,一切正常,不同之处在于 POST 数据是用响应内容而不是 ACK 来回复的。

关于如何解决这个问题的任何建议,所以我回复了 POST 数据和 GET。


我现在坚持这一点,正如您从这个 Wireshark 跟踪中看到的那样(单击图片链接),我已将超时时间增加到 20 秒。它仍然无法正常工作。我会做更多的调查。看看我能找到什么。看起来 Indy 认为在断开连接之前就已经发生了

点击这里查看图片

0 投票
3 回答
880 浏览

delphi - Better Indy for Dephi 2007

Which better is using default indy10 that's comes with Delphi 2007 or upgrade it to latest snapshot version and why ?

Thank you

0 投票
1 回答
3436 浏览

delphi - Delphi Indy10:IdTCPClient如何获取Server的响应,响应的长度未知

主机:127.00.0.1;端口:5001;读取超时:3000;

当timerout时,其他操作的部分将不会被执行。有什么想法可以继续代码吗?谢谢。

0 投票
1 回答
1195 浏览

delphi - 德尔福使用 Indy 10

我正在使用 Delphi 4,并且我想创建一个标准的非阻塞套接字,而不需要混乱的 Indy 代码(Pv4 和 Pv6)。我想获取计算机的 IP 地址并能够 ping 有任何人这样做。我可以用 Indy 10 或 Indy 9 来做吗?有没有人编写代码来做这些事情并请对其进行测试。

0 投票
3 回答
1999 浏览

delphi - Twitter OAUTH and a Win32 EXE Desktop Application

I have been coding against a Delphi EXE (win32 desktop app) to access twitter and do certain functions. It used to use Basic authentication with the api limitation. I know I have to convert this to OAuth. I have been reading over the documentation trying to determine the best approach. I understand the best method is the Web browser with a call back url. I also know that Twitter includes a Pin Based (oob) authentication method. I figured this was the route to go with this application, but I want to make sure since that is not seamless. It requires the user to go external to the application and get a pin number. It also is not as secure since the access token returned never expires.

I am using Indy v10 components to do the GET/POST operations, so I am wondering if there is a way to do this using them and being able to do a callback and not use the Pin authentication method.

Can anyone help me?

Also I've been trying to get Chuck Beasley's Twitter Class working in Delphi 7 with Indy v10 and I've been having trouble. IdObjs and Idsys don't exist anymore. Has anyone got this class to work with my scenario? Thanks, David

0 投票
2 回答
3608 浏览

mysql - 需要使用 delphi 应用程序引导 SSH 隧道

我创建了一个 Delphi 2010 应用程序。它被该地区的许多公司使用,从受信任的用户到不受信任的用户。应用程序在 MD5 加密密码后面使用 MySQL 对用户进行身份验证。在此之后,应用程序需要通过 ftp 上传和下载许多文件。

事实是:任何网络嗅探器(例如 Ethereal,也称为 WireShark)都可以从我的应用程序的 ftp 部分获取我的普通用户和密码。也可以获取加密密码,任何人都可以使用任何 ftp 应用程序登录到我的服务器并做出不愉快的事情。

[TindyFTP]用于管理 FTP 连接本身。这个对象不支持 SFTP,我认为这可能是我问题的结束。

DEVART 的[tMyMac]用于管理 MYSQL 连接。

我现在的意思是:这是使用 SSH 隧道控制(ftp 和 mysql)事务类型的 IO 处理程序到我的应用程序的好方法吗?我现在正在使用DEVART 的SecureBridge进行一些测试,它与 MyDAC 组件和 TIndy 兼容。

我是否只需要连接到SSH 隧道并使用 mysql 和 ftp 进行处理?使用 SSH 隧道时是否还需要加密 ftp 密码?对于 MySQL 部分,当我尝试使用 WireShark 拦截密码时,密码似乎被加密或混淆了。

感谢从那时起让我知道您的想法,而无需更改已完成 99% 的程序的所有结构 :)

谢谢,乔纳森