问题标签 [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.
delphi - 支持 SSL 的简单 TIdHttpServer 示例
希望有人可以为我提供一个支持 SSL的简单TIdHttpServer示例。使用 Delphi2007 和 Indy10。我有以下内容来创建/设置服务器和 ioHandler:
mycert.pem是使用 openssl 和以下命令创建的:
我马上认为有问题,因为我对CertFile, KeyFile, RootCertFile使用相同的文件。
我为提示输入了空格,但通用名称除外。我确定设置为我正在使用的域名(假设它是myexample.com)。
在浏览器中,如果我点击http://myexample.com会导致异常:Error accepting connection with SSL。点击https://myexample.com永远不会进入我的代码。
1 月 30 日注意 - 我使用 sslbuddy 生成密钥。这仍然没有奏效。然后我注释掉了以下几行,它起作用了:
delphi - 使用 Indy10 idSMTP 的意外端口号(Delphi / C++ Builder)
尝试使用 发送邮件Indy10
,但似乎想使用 port465
而不是 port 25
。我已经在允许端口 25 的各种 SMTP 服务器上对其进行了测试,但我只收到以下消息:
无法连接到 SMTP 服务器 (62.149.128.11: 465 ),连接错误 10060。
这是我的简单代码:
delphi - Indy 10 中的双向 TCP 通信?
我正在使用 TIdCmdTCPClient 和 TIdCmdTCPServer。突然间我发现我可能喜欢双向交流。
什么是最好的?我应该使用其他一些组件吗?如果是这样,是哪个?还是我应该拼凑让“客户端”轮询“服务器”以询问它是否希望交流任何内容?
这是一个非常小的系统。两个客户端和十个服务器,每天每 30 到 60 秒爆发一次,持续几分钟,因此轮询的开销是无关紧要的。
如果有一个“正确”的方式,我只是想知道。
更新:这确实是一个非常简单的系统。流量很少,一切都很简单。所有的传输都是一个可选的单个参数类型的指示。
<event type> [ <parameter>]
例如"HERE_IS_SOME_DATA 42"
这可以双向发送,悬停在这里不是“回复”。只是发出一条消息(并希望它到达那里)?收到没有数据的确认?未捕获异常表示消息发送成功?)
使用两个 TIdCmdTCPServer 是否可能(是否会过大)?
delphi - 开发时连接太多
我正在尝试(在这个社区的大力帮助下)将我的第一个客户端/服务器应用程序放在一起。
我正在使用 Indy 10 和 Delphi Xe2,但我怀疑我的问题不在于这些,而在于套接字的工作方式(如果你问我,巫术和黑魔法)。
因为我经常在按 Alt+F2 停止之前遇到异常断点并单步执行我的代码,所以我的下一次运行经常遇到异常“已经连接”,最终我得到“连接太多”。
我该如何收拾这个?
(另外,有没有人有一个使用 try ... 除了,ratehr 比 try ... finally 如 Indy 演示中的演示?)
delphi - 为什么在某些情况下,使用 idSMTP 发送的电子邮件无法正确进入新行?
我正在使用TIdMessage
和发送纯文本电子邮件TIdSMTP
。
对于Body
我使用一个简单的连接字符串,如
无论如何,在生成的电子邮件中,一些“ #13#10
”不会被忽略。我记录了Body
变量,我可以看到文本进入新行,无论如何在电子邮件中这不会发生。奇怪的是,这不会发生在每一行,而只会发生在某些行上。
你知道为什么会发生这种情况吗?你能建议一些检查吗?#13#10
在某些情况下,文本电子邮件正文之间是否存在一些可能的冲突?
更新
经过更多调查(感谢您的评论),我意识到这是一个 Outlook 可视化问题,无论如何我仍然不清楚这个问题。
这是在 NotePad++ 中打开的电子邮件的正文(我打开了从 Outlook 保存的 msg 文件),其中还显示了换行符(您可以看到 #13#10 为 CR LF。我用红色和绿色突出显示了 2 个换行符前景有问题(但您可以看到在 NP++ 中它们看起来像所有其他换行符):
Outlook 中的电子邮件看起来像这样(请注意,Outlook 说邮件有额外的换行符并且它们已被删除,但他提供了恢复它们的选项:
选择该选项后,电子邮件就可以了:
我不明白为什么这只发生在某些换行符上。这是否有助于您更好地理解问题?
delphi - 求简单的INDY demo
我想要一个简单的客户端服务器通信,我可以使用一个底层框架,而不必再看一遍。我想专注于我的应用程序,并拥有一个简单的功能 API:
- 我确实需要知道服务器是否回复了;如果是这样,结果字符串是什么
- 如果 serer 使用 Indy 命令处理程序会很好,但并不重要,因为我可以自己解析接收到的字符串
- 也“很高兴”并且INDY演示似乎没有涵盖它(据报道,我似乎无法找到的SMTP演示除外)将是服务器启动与客户端的通信。如果没有,我可以让客户端轮询,或者让服务器将其通信作为对我需要添加的客户端心跳的回复发送。
提前感谢 1,000,000。Indy 10 演示的 URL 或名称就足够了
更新:我真的不希望我的应用程序必须了解有关套接字的任何信息(除了输入 IP 地址和端口号)。
我不想知道是否存在连接,更不用说它是否始终打开或与每个传输请求连接(并且,如果始终打开,我希望它在关闭时自动重新打开)。对于那些关心表示“保持连接打开”的人来说,最多是一个布尔值。
更新更新:我应该关闭这个问题并发布另一个,更好地改写它吗?当然,我不是唯一一个“只想将一些数据发送到另一台 PC”并且并不真正关心它是如何完成的人?没有现成的框架吗?你们如何开始每个新项目?您是否有一个简单的虚拟项目来处理您添加新应用程序的“管道”?你知道这样的事情吗?
delphi - 通过 Delphi 和 Indy 10 TIdHTTP 获取 WebDAV 内容
查看 Delphi 新闻组,似乎从 WebDAV 服务器获取内容的最佳方法是使用内置的 TIdHTTP.Get。这样做时,结果是 HTML,我只想确保这是检索有关目录和文件的数据的最佳方式。如果是这样,那么我会将其解析出来,但我只是想确保没有一种更简洁的方法可以只为我提供文件/文件夹信息......不,到目前为止我不希望为此使用任何其他组件。
delphi - 连接到 dbx DataSnap 用户会话的消息循环
有没有办法连接到 dbx 用户会话的 WndProc?
背景:dbx DataSnap 使用 Indy 组件进行 TCP 通信。在最简单的形式中,DataSnap 服务器是一个接受连接的 Indy TCP 服务器。建立连接后,Indy 会为该连接创建一个线程来处理该连接的所有请求。
这些用户连接中的每一个都消耗资源。对于具有几百个同时连接的服务器,这些资源可能很昂贵。许多资源可以被池化,但我不想总是在每次需要时获取和释放资源。
相反,我想实现一个空闲计时器。在线程完成资源后,计时器将启动。如果线程在计时器结束之前访问资源,则资源仍将“分配”给该线程。但是,如果在下一次访问之前计时器已过,则资源将被释放回池中。下次线程需要资源时,将从池中获取另一个资源。
我还没有找到办法做到这一点。我试过使用 SetTimer 但我的计时器回调永远不会触发。我认为这是因为 Indy 的线程 WndProc 没有调度 WM_TIMER。我无法控制该线程的“执行循环”,因此我无法轻松检查是否已发出事件信号。事实上,除非线程正在处理用户请求,否则我的这个线程的代码都不会执行。事实上,我希望代码在任何用户请求之外执行。
对原始问题的解决方案或替代方法的建议将同样受到赞赏。
delphi - TIdFtp 仅在首次运行时导致 List out of bounds 错误
我对以下代码片段有疑问
启动后我的程序第一次运行此函数时,IdFtp.List 命令给出以下错误
带有消息“列表索引超出范围 (1)”的 EListError
但是在第二次运行时没有发生错误
我曾尝试在 Delphi 2010 上将 Indy 升级到最新版本 build 4734,但没有成功
一些进一步的信息,在错误的时候调用堆栈显示
- :7547b9bc KERNELBASE.RaiseException + 0x58
- :0043652e TList.Get + $1A
- :0043652e TList.Get + $1A
- IdComponent.TIdComponent.EndWork(wmRead)
- IdComponent.TIdComponent.EndWork(wmRead)
- IdComponent.TIdComponent.EndWork(wmRead)
- IdIOHandler.TIdIOHandler.ReadStream($229ADD0,-1,True)
- IdFTP.TIdFTP.InternalGet('NLST REKIM- 0130 ',$229ADD0,False)
- IdFTP.TIdFTP.List(nil,'REKIM- 0130 ',False)
- IdFTP.TIdFTP.List('REKIM- 0130 ',False)
- unitMainTntNavi.TfrmMain.FinnaSkrar('REKIM- 0130 ',$22BE730)
OnDirParseStart 和 OnRetrived 目录尚未触发
并且 IdFTP1.DirFormat 字符串为空
首先调用 IdFTP1.RetrieveCurrentDir 没有帮助
调用 IdFTP1.List(nil) 具有相同的结果
delphi - Delphi XE2 Indy 10 TIdCmdTCPServer 冻结应用
我刚刚开始学习如何在 Delphi XE2 中使用 Indy 10 组件。我从一个将使用命令套接字(TIdCmdTCPServer
和TIdCmdTCPClient
)的项目开始。我已经设置好所有东西并且客户端连接到服务器,但是在客户端连接之后,服务器发送给客户端的任何命令都会冻结服务器应用程序,直到它最终崩溃并关闭(在深度冻结之后)。
项目设置
设置非常简单;有一个小型服务器应用程序和一个小型客户端应用程序,每个应用程序都有其对应的 Indy 命令 tcp 套接字组件。客户端上只有一个命令处理程序。
服务器应用
在服务器上,我有一个非常简单的上下文包装器type TCli = class(TIdServerContext)
,它只包含一个公共属性(继承实际上是 Indy 的要求)。
客户端应用
另一方面,客户端工作得很好。它从服务器接收命令并做它的事情。客户端有一个计时器,如果它尚未连接,它会自动连接。当前设置为在应用启动 1 秒后尝试连接,如果尚未连接,则每 10 秒继续尝试连接。
问题详情
我能够成功地从服务器向客户端发送一两个命令(客户端响应正确),但是服务器在发送命令后冻结了几秒钟。我在服务器上有、、 和的事件处理程序OnConnect
,它们所做的只是发布日志或在列表视图中处理连接/断开连接对象。OnDisconnect
OnContextCreated
OnException
截屏
最后,当客户端应用程序优雅地关闭时,服务器也会优雅地脱离其冻结状态。但是,如果客户端被强制关闭,那么服务器也被强制关闭。这就是我看到的模式。它发布到日志事件PostLog(const S: String)
,只需将短消息附加到 TMemo。
我做了两个项目,两个都有问题。我准备了一个示例项目...
服务器代码(uServer.pas和uServer.dfm)
客户端代码(uClient.pas和uClient.dfm)