Websocket 聊天实现

Posted

技术标签:

【中文标题】Websocket 聊天实现【英文标题】:Websocket chat implementation 【发布时间】:2014-07-22 15:43:18 【问题描述】:

我看到的Websockets 的大多数演示都是关于聊天室应用程序的。我想知道是否可以创建更多的即时消息实现。不同之处在于,在聊天室应用程序中,众多用户连接并与每个人共享消息,而在即时消息应用程序中,用户可以连接到他们选择的其他用户。

我希望它可以在没有任何插件的情况下工作。我在客户端使用javascript,在服务器端使用Java EE。我研究了能够更改端点URL,但似乎必须在编译时知道它。我还研究了在onMessage 方法中使用Session 对象,但我怎么知道我需要向其发送消息的用户的会话对象?而且我觉得这将是一种循环遍历所有会话对象以寻找正确对象的缓慢方法。那么,如何使用WebSockets 创建类似即时消息的应用程序?

【问题讨论】:

【参考方案1】:

Websockets 用于使用 HTTP 协议在服务器和客户端之间进行通信。

它们是任何跨语言/跨平台实时流/消息传递相关任务的特别适合的解决方案,因为当任何新数据到达时,客户端/消费者会立即得到通知,而无需轮询* *.

浏览器实现规范的客户端部分。

大多数服务器端语言都有实现服务器部分的库。

如果您想要基本的即时消息,它就像常规聊天一样简单:您只需将聊天室中每个人的收件人列表更改为该对话中的特定客户。

如果您想构建一个生产级即时通讯应用程序,您应该意识到您不必重新发明***:您可以在任何 XMPP 库之上构建您的通讯程序应用程序,或者编写您自己的协议。无论哪种方式,它都减轻了很大一部分设计负担,让您专注于 GUI 或您认为合适的任何扩展。

如果您对后者感兴趣。查看atmosphere(特别是他们的plugins and extensions)和这篇文章(有点旧,但它是很好的介绍性内容):

http://jfarcand.wordpress.com/2010/11/08/using-jquery-xmpp-and-atmosphere-to-cluster-your-websocketcomet-application/

(** 如果您想使用 RMI,例如,您需要在服务器端和客户端都使用 JVM,或者需要 RMI-IIOP 实现来支持 CORBA,这对于简单的任务来说非常麻烦。还有一些基于Comet 的流行替代方案,这比 W3C 标准更像是一组技术:它比 websockets 更难使用并且有一些限制,但具有使用遗留技术和实时实现的好处通过使用 HTTP 1.1 持久连接,无需轮询即可进行通信)

【讨论】:

如何将收件人列表更改为特定客户? 这实际上很简单:您的服务器应用程序通常会跟踪您连接的客户端(比如哈希表或链表或某种包含当前 Web 套接字连接集的结构),按顺序向该表中的所有人广播消息,但消息源除外。现在,您只需将对话 ID 与消息一起发送,并(在服务器上)保留一个额外的对话表,其中包含指向参与其中的连接的指针,因此您可以将每条消息广播给正确的用户. (如果您使用的是标准协议,例如 XMPP,实现将为您提供处理该问题的接口)

以上是关于Websocket 聊天实现的主要内容,如果未能解决你的问题,请参考以下文章

Swoole+Redis+webSocket实现点对点即时聊天

Swoole+Redis+webSocket实现点对点即时聊天

SpringBoot+Vue+WebSocket 实现在线聊天

iOS通过SocketRocket实现websocket的即时聊天

使用WebSocket实现聊天室

使用WebSocket实现聊天室