0

大家好。在我的 WebSocket 应用程序中,WS 服务器需要处理三种消息:DataPkg、SigPkg 和 WS_SigPkg。DataPkg 是用于用户数据的二进制文件,带有控制器标头;SigPkg 是String 用于WS 客户端之间的用户数据控制,WS_SigPkg 也是String 用于诸如注册到WS 服务器以及在不同WS 会话之间切换DataPkg 和SigPkg。

所以我放了六个编码器/解码器:

decoders = {SigDecoder.class, WS_SigDecoder.class, DataDecoder.class},
encoders = {SigEncoder.class, WS_SigEncoder.class, DataEncoder.class}

然后我得到以下错误:

Caused by: javax.servlet.ServletException: Web socket server initialization failed.
    at org.glassfish.tyrus.servlet.TyrusServletFilter.init(TyrusServletFilter.java:126)
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:131)
    ... 28 more
Caused by: javax.websocket.DeploymentException: Class org.sample.xyzserver.XyzServer. Text MessageHandler already registered.

似乎 GlashFish Server 4.1.1 无法为字符串消息添加两个 MessageHandler,尽管在上层它们是不同的,解码器可以找到。

这里是否有任何误解或有一个简单的解决方法,或者我必须重构只使用一个 MessageHandler 用于字符串和一个用于二进制?谢谢。

4

1 回答 1

0

这是设计的Session.addMessageHandlerMessageHandler每种消息类型(文本、二进制或 pong)只能注册一个。Javadoc指出:

注册以处理此对话中的传入消息。每个本地 websocket 消息类型(文本、二进制、pong)最多可以添加一个消息处理程序到每个会话。即最多一个消息处理程序来处理传入的文本消息,最多一个消息处理程序来处理传入的二进制消息,最多一个消息处理程序来处理传入的 pong 消息。有关哪些消息处理程序处理哪些本机 websocket 消息类型的更多详细信息,请参阅 MessageHandler.Whole 和 MessageHandler.Partial。 添加多个任何一种类型都会导致运行时异常

于 2016-01-11T14:54:28.607 回答