下午好大师,
我对基本的套接字编程和IO :: Socket模块非常熟悉,但我现在需要编写一些我之前没有遇到过的东西.它将是一个3层应用程序.第一层是事件循环,在遇到某些事件时向上游发送消息.第二层是"中间件"服务器,其中(除其他外)充当消息库.第三层是cgi应用程序,它将更新图形显示.
我很困惑如何设置服务器以接受来自多个客户端的单向连接,并与另一方面的cgi应用程序进行双向通信.我可以单独执行这些任务中的任何一个,而不是在同一个脚本中(尚未).我的问题有意义吗?我想坚持使用IO :: Socket模块,但无论如何都不是必需的.我不是要求优秀的代码,只是建议套接字的建议以及如何通过服务器从一个客户端与另一个客户端进行通信.
此外,让cgi应用程序在服务器上查询新消息,或让服务器将新消息上游推送到cgi应用程序更有意义吗?图形更新需要接近实时.
先感谢您,
达人
你说你已经在第一层有一个事件循环.在某种程度上,您的第二层服务器还应该为异步处理安排某种事件循环.有很多方法用perl,喜欢它的代码AnyEvent,POE,Event以仅举几例.最终,他们都使用的一个select,poll,epoll,kqueueOS设施(或同等在Windows上).如果您觉得在相对较低级别编码感觉很舒服,您可以使用perl的select内置,或者使用它的面向对象的对应物IO::Select.
基本上你创建了两个监听套接字(如果第一层使用与第三层相同的通信协议与服务器通信,则可能只需要一个),将其添加到IO::Select对象并对其进行选择.建立连接后,将接受的套接字添加到选择对象.这个select方法IO::Select会给你一个准备好读或写的套接字列表(我在这里忽略了异常的可能性).当然,你必须跟踪你的插座,知道哪一个是哪个.此外,通信逻辑会有些复杂,因为您必须使用非阻塞套接字.
至于你问题的第二部分,我对"cgi"的含义有点困惑 - 它是一个通用网关接口(即服务器端的网页脚本),还是它是"计算机图形学的简写" ".在这两种情况下,我认为您的任务使用服务器推送是有意义的.在后一种情况下,这就是我想说的.在前一种情况下,我建议你谷歌"彗星"(如"AJAX").:-)