java – onMessage批注中包含多个数据的Websockets

前端之家收集整理的这篇文章主要介绍了java – onMessage批注中包含多个数据的Websockets前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用websockets.我想使用具有不同数据类型的多个@onMessage重载方法.
在客户端我有一个以下方法
@OnMessage
public void onMessage(Message message) {
    System.out.println(message.getContent()+":"+message.getSubject());
}

@OnMessage
public void onMessage(String message) {
    System.out.println(message);
}

其中Message是pojo类并对其进行解码和编码.

在服务器端

@OnMessage
public void onMessage(String msg,Session session) {
    try {

        System.out.println("Receive Message:" + msg);

        session.getBasicRemote().sendText("{\"subject\":\"This is subject1\",\"content\":\"This is content1\"}");
        session.getBasicRemote().sendText("This is Example Test");


    } catch (IOException ex) {
        Logger.getLogger(Server.class.getName()).log(Level.SEVERE,null,ex);
    }
}

我收到以下错误

javax.websocket.DeploymentException: Class: clientwebsocket.MyClient. Text MessageHandler already registered.

at org.glassfish.tyrus.core.ErrorCollector.composeComprehensiveException(ErrorCollector.java:83)
at org.glassfish.tyrus.client.ClientManager$1.run(ClientManager.java:384)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at org.glassfish.tyrus.client.ClientManager$SameThreadExecutorService.execute(ClientManager.java:565)
at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:110)
at org.glassfish.tyrus.client.ClientManager.connectToServer(ClientManager.java:343)
at org.glassfish.tyrus.client.ClientManager.connectToServer(ClientManager.java:182)
at clientwebsocket.ClientWebSocket.start(ClientWebSocket.java:31)
at clientwebsocket.ClientWebSocket.main(ClientWebSocket.java:40)

任何人都可以建议我们如何使用多种类型的数据发送到服务器或从服务器发送数据.

解决方法

这是不可能的. JSR 356明确定义每条文本消息只能有一个消息处理程序,每个二进制消息一个,每个 PongMessage一个.参见 @OnMessage javadoc:

======

方法级别注释可用于使Java方法接收传入的Web套接字消息.每个websocket
端点可能只对每个本机websocket消息格式有一个消息处理方法:text,binary和pong.方法
允许使用此注释
下面描述的类型的参数,否则容器将在部署时生成错误.
允许的参数是:

>以下任何一种选择中的任何一种

>如果方法正在处理短信:

> java.lang.String收到整条信息
> Java原语或类等效于接收转换为该类型的整个消息
> String和布尔对以部分接收消息
> java.io.Reader将整个消息作为阻塞流接收
>端点具有文本解码器的任何对象参数(Decoder.Text
Decoder.TextStream).


>如果方法正在处理二进制消息:

> byte []或java.nio.ByteBuffer接收整个消息
> byte []和boolean对,或java.nio.ByteBuffer和boolean对,用于接收部分消息
> java.io.InputStream将整个消息作为阻塞流接收
>端点具有二进制解码器的任何对象参数(Decoder.Binary
Decoder.BinaryStream).


>如果方法正在处理pong消息:

> PongMessage用于处理乒乓消息




>和零到n字符串或Java原始参数
使用服务器端点的javax.websocket.server.PathParam注释进行注释.
>和一个可选的Session参数


参数可以按任何顺序列出.

方法可以具有非void返回类型,在这种情况下是web套接
运行时必须将此解释为Web套接字消息以返回到对等方.
此返回类型的允许数据类型(void除外)为String,
ByteBuffer,byte [],任何Java原语或类等价物,以及任何东西
哪个有编码器.如果该方法使用Java原语作为返回
值,实现必须构造使用的发送文本消息
Java原语的标准Java字符串表示,除非有开发人员
提供了为此端点配置的类型的编码器,其中
必须使用编码器的情况.如果方法使用
一个类等效的Java原语作为返回值的实现
必须从Java原语等效的构造文本消息
如上所述.

开发人员应该
请注意,如果开发人员在调用具有返回类型的方法期间关闭会话,则e方法将完成但是
返回值不会传递到远程端点.发送失败将传递回端点的错误处理方法.

例如:

@OnMessage
 public void processGreeting(String message,Session session) {
     System.out.println("Greeting received:" + message);
 }

例如:

@OnMessage
 public void processUpload(byte[] b,boolean last,Session session) {
     // process partial data here,which check on last to see if these is more on the way
 }

开发人员不应继续引用类型为java.io.Reader,java.nio.ByteBuffer的消息对象
或者注释方法完成之后的java.io.InputStream,因为它们可以通过实施回收.

猜你在找的Java相关文章