Delphi tcpServer异步请求

时间:2014-09-24 21:35:29

标签: delphi tcpclient tcpserver

我正在Delphi中开发一个消息传递系统。我在我的服务器应用程序中使用了idTcpServer,在我的客户端应用程序中使用了idTcpClient。客户端应用程序每隔10秒ping一次服务器以查看连接是否处于活动状态,并告诉服务器将用户的状态设置为Online。并且用户也可以向他的联系人发送消息。所有这些请求之后都是来自服务器的响应,我在发送请求后立即通过socket.readln命令获得。例如,ping服务器:

TcpClient.socket.writeln('i am online');
if TcpClient.socket.readln = 'ok' then
  begin
    {commands}
  end; 

我还使用Long Polling检查新消息。我从tcpClient发送'check for new messages ' + timestamp,然后在服务器上,我检查数据库中是否有比While循环中收到的时间戳更新的新消息,所以当有新消息时,循环中断并发送通知给客户。

但这个系统对我不起作用。有时,当客户端应用程序正在ping服务器时,我会得到针对checking for new messages的响应。

我在php中开发了相同的系统没有问题。但这里一定有问题。

我认为这不是异步的。我该怎么办?

1 个答案:

答案 0 :(得分:1)

关于check for new messages请求,服务器不应该循环等待新消息到达。要么在请求时有新消息可用,要么没有。获取请求,执行查询,报告结果,然后继续。客户端可以定期发送新的check for new messages请求。或者,让客户端告诉服务器一次它想要新消息,然后服务器可以在他们到达服务器时实时主动地将新消息推送到客户端,而不是轮询它们(类似于IMAP&#39 ; s IDLE命令)。

我建议您重新设计通信协议以异步运行。大多数现代IM服务都是异步的。当客户端发送请求时,不要指望立即回复。让客户转向其他事情。让它运行一个单独的计时器/线程来读取所有入站数据。当答复到达时,客户可以对其采取行动。如果需要,请在请求中包含一个在回复中回显的标识符,以便客户端可以跟踪它发送的请求。这也允许服务器在其末端使用异步处理,因此如果请求需要很长时间才能运行,则服务器可以将其推送到另一个线程/进程并在此期间继续处理其他请求。准备就绪后发送最终答复。