多个聊天室 - 只使用端口吗?如果有数百个房间怎么办?

时间:2011-04-15 03:30:42

标签: python livechat

需要一些方向。 我正在写一个聊天室浏览器应用程序,但是有一个微妙的区别。

这些是协作聊天,其中一个人键入,另一个人可以看到live 键入其他人时键入的

此外,聊天空间不是单行而是textarea空间,就像这里输入问题(SO)一样。

包括标签/空格/输入在内的所有击键应该对其他人是实时可见的。并且只有一个人可以一次打字(我想锁定应该是微不足道的)

我还没有写过多个聊天室应用程序。我写的是一个简单的客户端/服务器,它们都通过端口进行通信。

以下是问题
1.)如何编写多个聊天室应用程序?它也是基于港口的吗? 2.)在键入时显示其他人的每次击键是我猜可以通过ajax。还有其他机制吗?

注意:我将使用python框架(web2py),但我不认为框架在这里很重要。

欢迎任何建议,谢谢!

2 个答案:

答案 0 :(得分:1)

您可以尝试执行类似IRC的操作,其中当前的“房间”从客户端发送到服务器“之前”文本(/PRIVMSG #room-name Hello World),由空格分隔。例如,您可以将ROOMNAME Sample text从浏览器发送到服务器。

使用AJAX将是最合理的选择。我从来没有使用过web2py,但我猜你可以使用JSON来解析浏览器和服务器之间的数据,如果你想要花哨的话。

答案 1 :(得分:1)

Comet (programming)的Wikipedia条目很好地概述了您可以在客户端上采取的不同方法(假设您的客户端是Web浏览器),并且这些方法建议服务器的正确设计(假设服务器是一个Web服务器。)

在该页面上没有提到的一件事,但你几乎肯定想要考虑的是缓冲客户端上的输入。我认为,考虑到每个用户的击键击中服务器的多用户应用程序的扩展性很差,这是不成熟的优化。我认为用户击键进入客户端缓冲区,只有当用户没有输入任何东西500毫秒左右时才将它们发送到服务器。

你绝对不想为此使用端口。这将应用程序层信息放在传输层中,它将应用程序级别的问题(应用程序将创建一个新的聊天室)推入传输级别的问题(需要在防火墙上打开一个新端口)。

此外,端口只是数据包标头中的16位字段。您可以在设计应用程序的消息时执行相同的操作:在每条消息的开头放置一个房间ID和一个用户ID,并让服务器对其进行排序。

令我感到痛苦的是,当客户请求更新时,应该发送什么。天真的解决方案是为一个房间中的每个用户保留一个缓冲区,并在每个(其他)用户的缓冲区中维护一个索引,作为用户状态的一部分;这样,当用户A请求更新时,服务器可以发送用户B,C和D自A的最后一个请求以来键入的所有内容。这引发了有关内存使用和持久性的各种问题,而这些问题没有明显的简单解决方案

我在这里讨论的问题的正确答案将取决于您的要求。确保非常详细地定义这些要求。你不想发现自己会问“我应该一起批量击键吗?”之类的问题。当你正在建造这件东西时。