2

在这方面需要一些指导。我正在编写一个聊天室浏览器应用程序,但是有一个细微的差别。

这些是协作聊天,一个人键入,另一个人可以看到live 其他人在键入时输入的任何键击

此外,聊天空间不是一行,而是一个文本区域空间,就像这里 (SO) 输入问题的空间一样。

包括制表符/空格/回车在内的所有击键都应该对其他人实时可见。而且一次只能一个人打字(我想锁定应该是微不足道的)

我还没有编写多聊天室应用程序。我已经编写了一个简单的客户端/服务器,两者都通过端口进行通信。

所以这里有问题
1.) 多聊天室应用程序是如何编写的?它也是基于端口的吗?
2.) 我猜想通过 ajax 向其他人显示他们键入的每个键击是可能的。有没有其他可用的机制?

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

欢迎任何建议,谢谢!

4

2 回答 2

1

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

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

于 2011-04-15T03:40:39.103 回答
1

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

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

您绝对不想为此使用端口。这就是将应用层信息放入传输层,并将应用层关注点(应用程序将创建一个新的聊天室)推入传输层关注点(需要在防火墙上打开一个新端口)。

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

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

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

于 2011-04-15T19:53:59.760 回答