大家好。在我的WebSocket应用程序中,WS服务器需要处理三种消息:DataPkg、SigPkg和WS_SigPkg。DataPkg对于用户数据是二进制的,带有控制器头;SigPkg是用于WS客户端之间的用户数据控制的字符串,并且WS_SigPkg也是用于诸如注册到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似乎无法为String消息添加两个MessageHandler,尽管在上层它们是不同的,解码器可以找到这一点。
这里有没有理解失误,或者有一个简单的解决方案,或者我必须重构,只使用一个MessageHandler用于字符串,一个用于二进制?谢谢
这是Session.addMessageHandler
的设计。每个消息类型(文本、二进制或乒乓)只能注册一个MessageHandler
。Javadoc声明:
注册以处理此会话中的传入消息。A.每个本机websocket消息类型最多有一个消息处理程序(文本、二进制、pong)可以被添加到每个会话。即最大值一个消息处理程序来处理传入的文本消息最多一个用于处理传入二进制消息的消息处理程序,以及其中一个用于处理传入的pong消息。有关的更多详细信息哪些消息处理程序处理本机websocket消息类型,请参阅MessageHandler.Whole和MessageHandler.Partial。添加任意一种类型中的多个将导致运行时异常。