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

时间:2014-02-27 07:02:10

标签: 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);
}

其中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)

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

1 个答案:

答案 0 :(得分:11)

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

==

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

允许的参数是:  

     
  1. 以下任何一种选择中的任何一种    
  2.  
  3. 和零到n字符串或Java原始参数  使用服务器端点的javax.websocket.server.PathParam注释进行注释。
  4.  
  5. 和可选的Session参数
  6.      参数可以按任何顺序列出。

    该方法可能具有非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.Readerjava.nio.ByteBuffer类型的消息对象  或者在注释方法完成后java.io.InputStream,因为它们  可以通过实施回收。