gpt4 book ai didi

java - 在 onMessage 注释中具有多个数据的 Websockets

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:13:40 26 4
gpt4 key购买 nike

我正在使用网络套接字。我想使用具有不同数据类型的多个 @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文档:

======

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

允许的参数是:

  1. 恰好是以下任一选项
  2. 和零到 n 字符串或 Java 原始参数 用 javax.websocket.server.PathParam 注释服务器端点的注释。
  3. 和一个可选的 Session参数
参数可以按任何顺序列出。

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

开发者应该 请注意,如果开发人员在调用具有返回类型的方法期间关闭 session ,则 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.ByteBufferjava.io.InputStream在注释方法完成后,因为它们 可能会被实现回收。

关于java - 在 onMessage 注释中具有多个数据的 Websockets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22061297/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com