Delphi中的TClientSocket持久连接

时间:2016-09-06 17:03:15

标签: c# sockets delphi

我有一个用Delphi编写的应用程序使用TClientSocket将数据发送到另一个用C#编写的应用程序。由于许多原因,C#应用程序响应缓慢,阻止了我的Delphi应用程序而不尊重我设置的超时。

我的Delphi应用程序读取这样的响应:

Sock.Socket.ReceiveText

这会导致应用程序等待响应。但是如果我这样做,应用程序会等待并尊重超时:

while not receiveData do
begin
  if Sock.Socket.ReceiveLength > 0 then
  begin
    receiveData := True;
  end;
  Inc(Cont); 
  Sleep(100);

  if (Cont > 10) then
    raise Exception.Create('Timeout');
end;

我的Delphi应用程序发送了两个请求。第一次超时,但C#仍在处理它。然后我的Delphi应用程序发送第二个请求,这次C#发送第一个请求的响应。

第二个请求是否会收到第一个请求的数据?或者,当我在Delphi中超时时,他们会交换信息吗?

1 个答案:

答案 0 :(得分:3)

一旦你的Delphi代码超时,就会忘记第一个请求,但是你的C#代码不知道。由于您没有丢弃连接,第二个请求确实会收到第一个请求的响应数据。通过实现超时逻辑然后忽略超时的原因,您将使两个应用程序彼此不同步。因此,要么使用更长的超时(或根本没有超时),要么在发生超时时丢弃连接。

对于你的Delphi应用程序冻结,只有在阻塞模式下使用TClientSocket组件并在主UI线程的上下文中执行读取时才会发生这种情况。您不应该在主UI线程中使用阻止模式。之一:

  1. 在非阻止模式下使用TClientSocket,仅在OnRead事件中执行所有阅读,且阅读时间不超过ReceiveLength

  2. 在阻止模式下使用TClientSocket,并在工作线程中执行所有读取,然后仅在有可用于处理的数据时发出主UI线程的信号(更好的是处理工作线程中的数据,仅在进行UI更新时与主线程同步。)