【问题标题】:3-way communication via sockets通过套接字进行 3 路通信
【发布时间】:2010-08-20 19:16:07
【问题描述】:

各位大师,下午好,

我非常熟悉基本的套接字编程和 IO::Socket 模块,但现在我需要编写一些我以前没有遇到过的代码。这将是一个 3 层应用程序。第一层是一个事件循环,当遇到某些事件时向上游发送消息。第二层是“中间件”服务器,它(除其他外)充当消息存储库。第三层是一个 cgi 应用程序,它将更新图形显示。

我很困惑如何设置服务器一方面接受来自多个客户端的单向连接,另一方面与 cgi 应用程序进行双向通信。我可以分别完成其中任何一项任务,只是不在同一个脚本中(还)。我的问题有意义吗?我想坚持使用 IO::Socket 模块,但这绝不是必需的。我不是要求完善的代码,只是关于设置套接字以及如何通过服务器从一个客户端到另一个客户端通信的建议。

另外,让 cgi 应用程序向服务器查询新消息,还是让服务器将新消息向上游推送到 cgi 应用程序更有意义?图形更新需要接近实时。

提前谢谢你,

达人

【问题讨论】:

  • 你能澄清一下这个问题吗?问题是如何同时管理多个套接字(侦听套接字、多个客户端套接字和与 cgi 程序的连接)之间的通信?
  • 约翰,是的,你明白了。我的问题是一次管理多个套接字。

标签: perl sockets


【解决方案1】:

你说你已经在第一层有一个事件循环。在某种程度上,您的第二层服务器也应该为异步处理安排某种事件循环。有很多方法可以使用 perl 对其进行编码,例如 AnyEventPOEEvent 等等。最后,它们都使用selectpollepollkqueue 操作系统设施之一(或它们在 Windows 上的等效设施)。如果您觉得在相对较低的级别进行编码很舒服,您可以只使用 perl 的 select 内置函数,或者,它的面向对象对应物 IO::Select

基本上,您创建两个侦听套接字(如果第一层使用与第三层相同的通信协议与您的服务器通信,您可能只需要一个),将其添加到 IO::Select 对象并对其进行选择。一旦连接 制作完成后,您将接受的套接字添加到选择对象。 IO::Selectselect 方法将返回一个可供读取或写入的套接字列表(我在这里忽略了异常的可能性)。当然,您必须跟踪您的套接字才能知道哪个是哪个。此外,通信逻辑会有些复杂,因为您必须使用非阻塞套接字。

至于你问题的第二部分,我有点困惑你所说的“cgi”是什么意思——它是通用网关接口(即服务器端 Web 脚本),还是它的简写“电脑图像”。在这两种情况下,我认为您的任务使用服务器推送是有意义的。 在后一种情况下,这就是我想说的。在前一种情况下,我建议你用谷歌搜索“彗星”(如“AJAX”)。 :-)

【讨论】:

  • 非常感谢。这正是我所需要的,朝着正确的方向轻轻推动。当我舔它时,我会提供更新。
【解决方案2】:

在标准的 CGI 应用程序中,我看不出如何将数据“推送”给它们。对于客户端交互,数据通过 CGI/表示层到达中间层以保留在会话存储(或缓存)中或到达后端以存储在数据库中。

当然,除非你有一个厚的应用层,它是一个缓存位置,本身就是一个中间层。

【讨论】:

    最近更新 更多