2014-09-24 212 views
0

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

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

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

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

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

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

回答

1

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

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

+0

感谢您的详细解答。我搜索了一下“使用tcpServer在delphi中推送消息”。我没有找到好的例子。你能否给我一些在线参考。我认为在我的服务器应用程序中,我应该将'idcontext'的数据保存到内存中,并将新的消息通知发送给它。它是否正确? – Agha 2014-09-25 13:40:21