下午好大师,
我对基本套接字编程和IO :: Socket模块非常熟悉,但我现在需要编写一些我之前没有遇到过的东西。它将是一个3层应用程序。第一层是事件循环,在遇到某些事件时向上游发送消息。第二层是“中间件”服务器,其中(除其他外)充当消息库。第三层是cgi应用程序,它将更新图形显示。
我很困惑如何设置服务器以接受来自多个客户端的单向连接,并且另一方面与cgi应用程序进行双向通信。我可以单独执行这些任务中的任何一个,而不是在同一个脚本中(尚未)。我的问题有意义吗?我想坚持使用IO :: Socket模块,但无论如何都不是必需的。我不是要求优秀的代码,只是建议套接字的建议以及如何通过服务器从一个客户端与另一个客户端进行通信。
此外,让cgi应用程序在服务器中查询新消息,或让服务器将新消息上游推送到cgi应用程序更有意义吗?图形更新需要接近实时。
提前谢谢你,
达人
答案 0 :(得分:5)
你说你已经在第一层有一个事件循环。在某种程度上,您的第二层服务器还应该为异步处理安排某种事件循环。有许多方法可以使用perl对其进行编码,例如AnyEvent
,POE
,Event
等等。最后,他们都使用select
,poll
,epoll
,kqueue
操作系统设施(或Windows上的等效设备)之一。如果您觉得在相对较低级别编码感觉很舒服,您可以使用perl的select
内置函数,或者使用其面向对象的版本IO::Select
。
基本上你创建了两个侦听套接字(如果第一层使用与第三层相同的通信协议与服务器通信,则可能只需要一个),将其添加到IO::Select
对象并执行选择它。一旦连接
制作完成后,将接受的套接字添加到选择对象。
select
IO::Select
方法将为您提供准备好读取或写入的套接字列表(我忽略了此处的异常可能性)。当然,你必须跟踪你的插座,知道哪一个是哪个。此外,通信逻辑会有些复杂,因为您 使用非阻塞套接字。
关于你问题的第二部分,我对“cgi”的含义有点困惑 - 它是一个通用网关接口(即服务器端的网页脚本),还是它的缩写“电脑图像”。在这两种情况下,我认为您的任务使用服务器推送是有意义的。 在后一种情况下,这就是我想说的。在前一种情况下,我建议你谷歌“彗星”(如“AJAX”)。 : - )
答案 1 :(得分:0)
在标准的CGI应用程序中,我看不出如何“推送”数据给他们。对于客户端交互,数据通过CGI /表示层到达中间层以保留在会话存储(或缓存)中或后端以存储在数据库中。
这当然是除非你有一个厚的应用程序层,它是一个缓存基因座,本身就是一种中间层。