onMessage注释中包含多个数据的Websockets

use*_*138 7 java websocket

我正在使用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);
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

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)
Run Code Online (Sandbox Code Playgroud)

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

Pav*_*cek 11

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

======

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

允许的参数是:

  1. 完全是以下任何一种选择之一
  2. 和零到n使用服务器端点的javax.websocket.server.PathParam批注注释的String或Java原始参数.
  3. 和一个可选的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);
 }
 
Run Code Online (Sandbox Code Playgroud) 例如:

 @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
 }
 
Run Code Online (Sandbox Code Playgroud)在注释方法完成后, 开发人员不应继续引用java.io.Reader, java.nio.ByteBufferjava.io.InputStream类型的消息对象,因为它们可能会被实现回收.