我正在尝试为某些网站创建一个类似应用程序的聊天室。为此,我有两个选择:
使用套接字编程并在服务器上打开套接字并将其连接到该聊天室中的所有客户端。对于此客户端,首先下载聊天室的小程序。
只需用1秒的时间间隔连续向Ajax发送请求,并刷新页面的聊天内容区域。
我无法决定哪种传统会更好。所以,如果有人告诉我哪些资源会更少,如果还有其他更好的选择那么请告诉我。
其次我想使用存储在服务器上的会话文件来维护所有登录用户的会话。那么我应该如何访问存储在服务器上的文件,以便我可以拥有一些会话对象的成员变量,如
sessionobject.chatroom="1"
。 //请不要去语法,但要注意其含义。
那么可以访问服务器上服务器创建的文件来维护会话吗?如果是,那么如何?
答案 0 :(得分:1)
对于客户端,我会看一下Comet,这是执行服务器端推送到浏览器的技术术语。您可以查看许多方法来执行此功能,其中两个是您提到的(长插槽和轮询)。这两种技术都可以使用CometD来执行,{{3}}是由Dojo Foundation使用Bayeux规范构建的JavaScript库。
至于确定哪种方法更好,您需要查看您的基础架构。许多服务器受到处理线程数量的限制,并且一次只能处理一定数量的传入套接字。一旦达到限制,任何进一步的套接字将排队(或根据服务器丢弃),直到套接字被释放。 Tomcat6以及其他较新的服务器确实支持使用NIO API,它允许非阻塞客户端套接字处理,从而消除了对传入套接字连接的限制。如果您在客户端和您自己之间有任何Web服务器,防火墙,代理,负载均衡器等具有套接字限制,则需要在最终解决方案中考虑到这一点。如果您的基础架构可以支持它,这种方法非常有用,因为它可以为您的客户提供最快的响应时间并降低套接字设置和删除的成本。提到的缺点是您的基础架构需要支持您预期的最大用户数(支持包括文件描述符等)。
使用轮询的另一种方法:虽然添加更多开销并且由于不总是被连接而具有较慢的响应时间,但是有利于允许后端可能使用更少的资源来支持相同数量的用户(更少的文件描述符,等等...)。
关于你的第二个问题,我不确定你在问什么。如果您尝试在该用户生成的请求之外访问用户会话中的信息,则该规范不允许这样做,并且将被视为安全违规。如果您正在讨论在该用户请求期间在用户会话中存储和访问信息,则可以使用标准HttpSession API。我建议你不要使用或尝试使用第一种方法,因为它不是一个好的设计。如果您需要维护所有用户线程都需要访问的用户数据,那么您将需要在单个用户的会话(数据库,文件等)外部维护该数据。
希望这有帮助。