Java WebSocket:多文本/数据MessageHandler

时间:2016-01-03 03:23:40

标签: java websocket message-handlers

大家好。在我的WebSocket应用程序中,WS服务器需要处理三种消息:DataPkg,SigPkg和WS_SigPkg。 DataPkg是用户数据的二进制文件,带有控制器头; SigPkg是用于WS客户端之间的用户数据控制的String,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无法为String消息添加两个MessageHandler,但在上层它们是不同的,解码器可以找到它。

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

1 个答案:

答案 0 :(得分:0)

这是Session.addMessageHandler的设计。每种消息类型(文本,二进制或乒乓)只能注册一个MessageHandlerJavadoc州:

  

注册以处理此对话中的传入消息。一个   每个本机websocket消息类型最多一个消息处理程序   (text,binary,pong)可以添加到每个Session。即最多   一个处理传入文本消息的消息处理程序最多一个   消息处理程序,用于处理传入的二进制消息和最大值   一个用于处理传入的乒乓消息。有关详细信息   哪些消息处理程序处理哪些本机websocket消息   请参阅MessageHandler.Whole和MessageHandler.Partial。   添加任意一种类型中的多个将导致运行时   例外