Delphi Indy TCP服务器冻结,不知道为什么

Delphi Indy TCP服务器冻结,不知道为什么,delphi,delphi-7,ado,indy,Delphi,Delphi 7,Ado,Indy,我有一个服务器和一个客户端(Delphi) 客户端获取登录详细信息,然后连接到服务器并将其发送到要验证的服务器,服务器接收数据并进行验证,然后返回给定数据是否正确 如果数据正确,客户机将继续进入下一个窗口,在该窗口中,客户机在相应字段中输入一些数据,然后将数据发送到服务器,当服务器接收到数据时,客户机将存储数据,然后回复客户机,客户机已成功存储数据。当客户端收到成功存储数据的通知时,它会显示一条消息,通知用户,然后终止 在测试时,当客户端运行在四台不同的计算机上时(每台计算机会打开和关闭客户端大

我有一个服务器和一个客户端(Delphi)

客户端获取登录详细信息,然后连接到服务器并将其发送到要验证的服务器,服务器接收数据并进行验证,然后返回给定数据是否正确

如果数据正确,客户机将继续进入下一个窗口,在该窗口中,客户机在相应字段中输入一些数据,然后将数据发送到服务器,当服务器接收到数据时,客户机将存储数据,然后回复客户机,客户机已成功存储数据。当客户端收到成功存储数据的通知时,它会显示一条消息,通知用户,然后终止

在测试时,当客户端运行在四台不同的计算机上时(每台计算机会打开和关闭客户端大约6次),服务器突然停止回复客户端(客户端显示消息说“连接正常关闭”)

这是服务器返回的错误:
因此,当ADOQuery打开连接以执行SQL时,错误似乎是,为什么只有在30次执行后才会导致异常

任何关于我的问题的建议,因为我不知道它可能是什么。 感谢您的帮助:)

如果客户端收到“连接正常关闭”错误,则表示服务器在服务器端关闭了该客户端的连接。如果服务器代码没有显式执行此操作,则通常意味着在服务器的事件处理程序中引发了未捕获的异常,这将导致服务器关闭套接字(如果在
OnConnect
事件之后和
OnDisconnect
事件之前引发异常,则在套接字关闭之前触发
OnDisconnect
TIdTCPServer
有一个
OnException
事件来报告该情况

TIdTCPClient
在销毁过程中关闭套接字(如果它仍然打开)

更新
TIdTCPServer
是一个多线程组件。每个客户端连接都在自己的线程中运行。ADO使用绑定到创建它们的线程的单元线程COM对象,并且只能在该线程上下文中使用,除非使用+,或接口跨线程边界封送

在这种情况下,您应该:

  • 为每个客户端提供自己的ADO连接和查询对象。您可以:

    A.在
    OnConnect
    事件中创建它们,并将它们存储在
    TIdContext
    中,以便在
    OnExecute
    事件中使用,然后在
    OnDisconnect
    事件中释放它们。或者根据需要在
    OnExecute
    事件中创建并释放它们

    B.从
    TIdThreadWithTask
    派生一个新类,并重写其虚拟
    BeforeExecute()
    AfterExecute()
    方法创建和释放ADO对象,然后将其中一个
    TIdSchedulerOfThread…
    组件分配给
    TIdTCPServer.Scheduler
    属性,并将线程类分配给
    TIdSchedulerOfThread.ThreadClass
    属性。然后,在服务器事件中,可以使用
    TMyThreadClass(TIdYarnOfThread(TIdContext.warn.Thread)
    访问调用线程的ADO对象

  • 创建一个单独的ADO对象池。当客户端需要访问数据库时,让它将适当的ADO对象封送到调用线程的上下文中,然后在完成后将对象放回池中


  • 无论哪种方式,由于ADO是基于COM的,请不要忘记在
    OnConnect
    OnDisconnect
    事件中,或在
    tidwithtask.beforexecute()中,为需要访问ADO对象的每个客户端线程调用
    CoInitialize/Ex()
    CoInitialize()
    TIdThreadWithTask.AfterExecute()
    方法。

    是什么阻止您调试此方法?是什么阻止您自己调查您的想法?请再次检查问题我添加了服务器端错误的屏幕截图