通过套接字进行三方通信

4

各位大牛们下午好,

我对基本的socket编程以及IO::Socket模块相当熟悉,但现在需要编写的是一种我以前从未遇到过的东西。它将是一个三层应用程序。第一层是事件循环,当遇到某些事件时向上游发送消息。第二层是“中间件”服务器,其中(除其他功能外)充当消息存储库。第三层是cgi应用程序,它将更新图形显示。

我对如何设置服务器以接受来自多个客户端的单向连接并与cgi应用程序进行双向通信感到困惑。我可以分别完成这些任务,只是不能在同一个脚本中完成(目前还不行)。我的问题是否有意义?我想继续使用IO::Socket模块,但这不是必需的。我不要求完美的代码,只需要有关设置套接字和如何通过服务器从一个客户端通信到另一个客户端的建议。

此外,对于查询新消息,cgi应用程序查询服务器是否更合理,还是让服务器将新消息推送到cgi应用程序?图形更新需要接近实时。

先感谢您的帮助,

Daren


请问您能否澄清问题?问题是如何同时管理多个套接字(监听套接字、多个客户端套接字和与 CGI 程序的连接)之间的通信吗? - Andrew E. Falcon
约翰,没错,你弄对了。我的问题在于同时管理多个套接字。 - Perl QuestionAsker
2个回答

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

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

至于您问题的第二部分,我有点困惑您所说的“cgi”是什么意思 - 它是Common Gateway Interface(即服务器端Web脚本)还是它是“计算机图形”的缩写。无论哪种情况,我认为对于您的任务来说使用服务器推送是有意义的。在后一种情况下,这就是我想说的全部。在前一种情况下,我建议您搜索“Comet”(如“AJAX”)。:-)


非常感谢。这正是我所需要的,一个正确方向上的温和推动。当我解决问题后,我会更新情况。 - Perl QuestionAsker

0
在标准的CGI应用程序中,我不知道如何“推送”数据给它们。对于客户端交互,数据通过CGI / 表示层传递到中间层以保留会话存储(或缓存),或者传递到后端以存储在数据库中。
当然,除非您有一个厚重的应用程序层,它是一个缓存聚集点,也是一种中间层。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接