创建聊天室应用程序时出现问题

2020年9月11日 15点热度 0条评论

我正在尝试为某些网站创建类似应用程序的聊天室。为此,我有两个选择:

要使用套接字编程并在服务器上打开套接字,然后将其连接到该聊天室中的所有客户端。对于该客户端,请先下载聊天室的applet。
只是以1秒的间隔连续使用Ajax向服务器发送请求,并刷新页面的聊天内容区域。

我无法决定哪种策略会更好。因此,如果有人告诉我哪一种资源消耗较少,并且还有其他更好的选择,请告诉我。

其次,我正在考虑使用存储在服务器上的会话文件来维护所有已登录用户的会话。所以我应该如何访问存储在服务器上的文件,以便可以拥有一些会话对象的成员变量,例如

sessionobject.chatroom="1"。 //请不要使用语法,而应使用其含义。

那么可以在服务器上访问服务器创建的文件来维护会话吗?如果是,那怎么办?

解决方案如下:

对于客户端,我来看一下Comet,这是用于执行服务器端向浏览器推送的技术术语。您可以查看许多方法来执行此功能,其中提到了两种方法(长套接字和轮询)。可以使用CometD来执行这两种技术,这是Dojo Foundation使用Bayeux规范构建的JavaScript库。

至于确定哪种方法更好,则需要查看基础架构。许多服务器受到处理线程数量的限制,并且在任何时候只能处理一定数量的传入套接字。一旦达到限制,所有其他套接字将排队(或取决于服务器而丢弃),直到释放套接字为止。 Tomcat6和其他较新的服务器确实支持使用NIO API,该API允许无阻塞的客户端套接字处理,从而消除了对传入套接字连接的限制。如果在客户端和您自己之间有任何Web服务器,防火墙,代理,负载平衡器等,并且有套接字限制,则在最终解决方案中需要考虑到这一点。如果您的基础架构可以支持此方法,则它非常有用,因为它可以为您的客户端提供最快的响应时间,并降低套接字设置和删除的成本。提到的缺点是您的基础结构将需要支持您期望的最大用户数量(支持包括文件描述符等)。

使用轮询的另一种方法:虽然由于不总是保持连接而增加了更多的开销并具有较慢的响应时间,但其好处是允许您的后端潜在地使用更少的资源来支持相同数量的用户(更少的文件描述符等)。 )。

至于你的第二个问题,我不太确定你在问什么。如果您尝试在该用户生成的请求之外访问该用户会话中的信息,那么这不是规范所允许的,将被视为违反安全性。如果您正在谈论在用户请求期间在用户会话中存储和访问信息,则可以使用标准HttpSession API来实现。我建议您不要使用或尝试使用第一种方法,因为这不是一个好的设计。如果需要维护所有用户线程都可以访问的用户数据,则需要在单个用户会话(数据库,文件等)外部维护该数据。

希望这可以帮助。