11

Java EE 7 允许您通过注释非常轻松地创建新端点。但是,我想知道是否有多个端点来处理每种消息类型是一个好主意,还是我应该只为所有内容设置一个端点外观?

基于每个端点创建到客户端的新套接字连接的理论,我倾向于拥有一个端点外观。然而,这个理论可能是不正确的,并且 Web Socket 可能会被实现,以便它只使用一个 TCP/IP 套接字连接,而不管连接了多少个 Web 套接字端点,只要它们连接到同一个主机:端口。

我特别要求 Java EE 7,因为可能有其他 Web 套接字服务器实现可能会做不同的事情。

4

2 回答 2

8

刚刚注意到我的问题有歧义:消息类型。当我说消息类型时,我指的是不同类型的应用程序消息,而不是诸如“二进制”或“文本”之类的本机消息类型。因此,我将@PavelBucek 答案标记为已接受。

但是,我确实尝试过使用 Glassfish 进行实验,并且有两个端点。我的怀疑是正确的,每个连接的端点都建立了一个 TCP 连接。如果在单个页面上使用多个 websocket 端点,这将导致服务器端的负载增加。

因此,我得出结论,只要一切都是单一的本机类型,就应该只有一个端点来处理应用程序消息。

这意味着应用程序需要进行调度,而不是依赖一些更高级别的 API 来为我们完成。

于 2014-07-11T01:18:45.473 回答
6

这里唯一有效的答案是后一种选择 - 具有多个端点。

请参阅WebSocket 规范章节 2.1.3:

API 将每个 Session 的 MessageHandler 注册限制为每个原生 websocket 消息类型一个 MessageHandler。[WSC 2.1.3-1] 换句话说,开发者最多只能注册一个 MessageHandler 用于传入文本消息,一个 MessageHandler 用于传入二进制消息,一个 MessageHandler 用于传入 pong 消息。如果违反此限制,则 websocket 实现必须生成错误 [WSC 2.1.3-2]。

至于使用或不使用多个 TCP 连接 - AFAIK 目前将为每个客户端建立新连接,并且没有简单的方法可以强制执行其他任何操作。WebSocket 多路复用应该可以解决它,但我认为没有任何 WebSocket API 实现支持它(我可能错了..)

于 2013-08-09T12:05:40.207 回答