我使用Indy的TIdTCPServer(D2009,Indy10)与客户端应用程序通信。在OnExecute方法中,我创建了一个任务并将其排队。工作线程执行任务并将其放入发送队列。然后发送队列将响应发送到客户端。在发送线程中,我循环遍历服务器的上下文列表并查找与任务中存储的IP和端口信息相匹配的上下文。然后执行一些有时会引发访问冲突的发送命令(我猜上下文在发送过程中被破坏)。现在问题来了:如何确保在发送响应之前上下文没有关闭?Indy是否可以从单独的线程发送,或者一切都应该在Indy线程中完成? 最佳答案 您可以尝试在发送数据时保
我对SSL和这些加密的东西完全陌生,但我需要让在移动设备上运行的客户端和服务器DelphiXE6应用程序进行通信。必须对TCP通信进行安全加密。首先,我简单地编写了基于Win32客户端和服务器交换字符串的Delphi/IndyTIdTCPServer/TIdTCPClient。(出自SourceForge上的indy10clieservr演示:svn://svn.code.sf.net/p/indy10clieservr/code/1_sampleSimpleStringExchange)我试图通过在服务器上添加TIdServerIOHandlerSSLOpenSSL组件和在客户端上添
我需要从IdTCPServer向特定连接的IdTCPClient发送一条字符串消息。一开始我使用的是列表框,所以我在客户端连接时将主机名添加到列表框,并在断开连接时将其删除。当时,RemyLebeau给了我这个提示:procedureTfrmMain.sendButtonClick(Sender:TObject);varIndex:Integer;Ctx:TIdContext;beginIndex:=ListBox.ItemIndex;ifIndex=-1thenExit;Context:=TIdContext(ListBox.Items.Objects[Index]);//useCo
我最近开始玩Indy10(来自DelphiXE3)和TCP连接。现在,我正在尝试创建一个简单的服务器应用程序来检查客户端状态。但是,当我尝试在某些客户端已连接的情况下停用TCPServer时,客户端会断开连接,但TCPServer会停止应答。我在某处读到TCPServer应该可以毫无问题地处理客户端的断开连接。我必须在OnExecute事件上添加一些代码才能解决这个问题吗?代码如下:procedureTfrmMain.btnConnectClick(Sender:TObject);beginIf(notTCPServer.Active)ThenTryTCPServer.Bindings
我正在使用TIdCmdTCPClient和TIdCmdTCPServer。突然发现我可能喜欢双向通信。什么最好?我应该使用其他一些组件吗?如果是这样,哪个?或者我应该拼凑并让“客户端”轮询“服务器”以询问它是否希望传达任何信息?这是一个非常小的系统。两个客户端和十个服务器,每30到60秒突发一个tarnscation,每天一次持续几分钟,因此轮询的开销是无关紧要的。我只是想知道是否有“正确”的方法。更新:这确实是一个非常简单的系统。流量很少,一切都很简单。所有传输都指示偶数类型和可选的单个参数。[]例如"HERE_IS_SOME_DATA42"这可以双向发送,悬停在这里不是“回复”。只
在由TCPServer/Client组件编写的Socket应用程序中,通常我们先激活服务器端,然后将客户端连接到服务器,当我们需要从一侧到另一端获取或发送数据时,首先从客户端向服务器发送一个命令,然后将开始通信。但问题是我们总是需要从客户端开始对话!我想问有什么想法可以在没有客户端请求的情况下从服务器端随机开始对话吗?我需要这个功能来从服务器端通知客户端。例如,当注册用户(客户端)连接到服务器时,其他连接的用户(在其他客户端),必须从服务器向所有用户(如YahooMessenger)发送通知。我正在使用TIdCmdTCPServer和TIdTCPClient组件
我正在尝试设置一个非常基本的单一客户端/服务器系统,这样我就可以从我的PC发送一个字符串到Android平板电脑。平板电脑对该字符串进行处理,然后将字符串发送回PC。代码:服务器端(平板电脑)procedureTForm1.Button1Click(Sender:TObject);//starttheserverbeginIdTCPServer1.Bindings.Clear;IdTCPServer1.Bindings.Add.SetBinding('xxx.xxx.x.x',4405);//forthexxx'stheIPadresofthetabletIdTCPServer1.Ac
我注意到当我正在与之通话的设备发送RESET响应时,我收到了一个EIdSocketError,其中LastError=10054或10053。这是有道理的,因为10054是对等连接重置。那么有什么我可以在Indy中检查以确定是否发生了这种情况,而不是将我的代码包装在try/exceptblock中并查找10054或10053错误代码?我遇到的一个场景是调制解调器在我连接后回复了一个RESET回复(Indy没有引发异常)所以从我的角度来看连接成功了。然后我尝试写入套接字(即使用TidTCPClient发送数据包)并引发了10054错误。是否有可能看到这个RESET回复?谢谢
我正在修改一个Indy10TCP/IP应用程序,我希望得到您关于实现执行以下操作的客户端功能的建议/意见/示例代码a)在应用程序启动时显示初始屏幕时,它会验证客户端计算机是否可以访问互联网并且TCP服务器已启动并正在运行并等待通信。如果不是这种情况,应用程序应该终止。b)在客户端和服务器之间进行任何数据交换之前执行上述(a)此外,服务器是否需要重复广播某种消息以通知潜在客户它已启动并正在运行?感谢您的协助。 最佳答案 如何验证是否可以连接到TCP服务器?第一个问题;肯定会将连接尝试包装到一个单独的线程中,您将在启动画面显示时运行该线
我已经编写了一个独立的http服务器,我想提供支持恢复的文件下载服务。当我使用IDM下载文件时,下载是单线程的:请注意,恢复能力是是,但是当我暂停并恢复下载时,它会从头开始。我的IndyHttp服务器是这样的:void__fastcallTfrmMain::httpServerCommandGet(TIdContext*AContext,TIdHTTPRequestInfo*ARequestInfo,TIdHTTPResponseInfo*AResponseInfo){Beep(1000,100);stringfileName=ExtractFileDir(Application->E