Jetty WebSocket 客户端不适用于二进制侦听器
Jetty WebSocket Client Doesn't work for Binary Listener
我有一个 Java 应用程序,它使用版本 9.x 的 Jetty WebSocket 客户端。它适用于从服务器发送的文本消息,但永远不会调用二进制侦听器。我有一个 Javascript 客户端实现,我基本上是在复制它。我在 Javascript 中做的事情与在 Java 中做的完全一样,调用同一个服务器。 Java 脚本有效,而 Java 无效。所以我认为 Jetty 中的二进制侦听器配置不正确。
例如,服务器正在发送 blob 数据。我知道在 Javascript 客户端中,我可以将 binarytype 设置为 arraybuffer 或 blob。我认为 Jetty 中可能需要类似的设置,但我已经查看了 API 并在线搜索了许多示例。在线二进制侦听器的示例很少,也没有提到设置二进制类型或使二进制侦听器工作所需的任何其他特殊设置。
这是我的代码的综合表示。该代码分布在各种 类 中,因此这不是一个独立的应用程序,但我认为它显示了我在做什么。服务器使用 libwebsockets 实现。
客户端实现
import org.eclipse.jetty.websocket.client.WebSocketClient;
import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
client = new WebSocketClient();
client.start();
client.setMaxBinaryMessageBufferSize((int) 500e6);//just to be sure
ClientUpgradeRequest request = new ClientUpgradeRequest();
request.setSubProtocols("pipe-data");
client = new SimpleSocket();
client.connect(socket, uri, request);
套接字实现
@WebSocket
public class SimpleSocket {
@SuppressWarnings("unused")
private Session session;
private SocketHandlerBase handler;
private boolean connected = false;
public SimpleSocket(SocketHandlerBase listener) {
this.handler = listener;
}
@OnWebSocketClose
public void onClose(int statusCode, String reason) {
this.handler.onClose(statusCode, reason);
this.connected = false;
}
@OnWebSocketConnect
public void onConnect(Session session) {
this.handler.onConnect(session);
this.connected = true;
}
//invoked when text messages are sent
@OnWebSocketMessage
public void onMessage(String msg) {
this.handler.onMessage(msg);
}
//does not get invoked when binary data is sent
@OnWebSocketMessage
public void onMessage(byte buf[], int offset, int length) {
this.handler.onMessage(buf, offset, length);
}
public boolean isConnected() {
return this.connected;
}
public SocketHandlerBase getHandler() {
return this.handler;
}
}
我调用的服务器很难找到问题。一个非常具体的调用参数配置导致二进制侦听器未被调用。这里一般不涉及 Jetty 客户端或 WebSockets。
我有一个 Java 应用程序,它使用版本 9.x 的 Jetty WebSocket 客户端。它适用于从服务器发送的文本消息,但永远不会调用二进制侦听器。我有一个 Javascript 客户端实现,我基本上是在复制它。我在 Javascript 中做的事情与在 Java 中做的完全一样,调用同一个服务器。 Java 脚本有效,而 Java 无效。所以我认为 Jetty 中的二进制侦听器配置不正确。
例如,服务器正在发送 blob 数据。我知道在 Javascript 客户端中,我可以将 binarytype 设置为 arraybuffer 或 blob。我认为 Jetty 中可能需要类似的设置,但我已经查看了 API 并在线搜索了许多示例。在线二进制侦听器的示例很少,也没有提到设置二进制类型或使二进制侦听器工作所需的任何其他特殊设置。
这是我的代码的综合表示。该代码分布在各种 类 中,因此这不是一个独立的应用程序,但我认为它显示了我在做什么。服务器使用 libwebsockets 实现。
客户端实现
import org.eclipse.jetty.websocket.client.WebSocketClient;
import org.eclipse.jetty.websocket.client.ClientUpgradeRequest;
client = new WebSocketClient();
client.start();
client.setMaxBinaryMessageBufferSize((int) 500e6);//just to be sure
ClientUpgradeRequest request = new ClientUpgradeRequest();
request.setSubProtocols("pipe-data");
client = new SimpleSocket();
client.connect(socket, uri, request);
套接字实现
@WebSocket
public class SimpleSocket {
@SuppressWarnings("unused")
private Session session;
private SocketHandlerBase handler;
private boolean connected = false;
public SimpleSocket(SocketHandlerBase listener) {
this.handler = listener;
}
@OnWebSocketClose
public void onClose(int statusCode, String reason) {
this.handler.onClose(statusCode, reason);
this.connected = false;
}
@OnWebSocketConnect
public void onConnect(Session session) {
this.handler.onConnect(session);
this.connected = true;
}
//invoked when text messages are sent
@OnWebSocketMessage
public void onMessage(String msg) {
this.handler.onMessage(msg);
}
//does not get invoked when binary data is sent
@OnWebSocketMessage
public void onMessage(byte buf[], int offset, int length) {
this.handler.onMessage(buf, offset, length);
}
public boolean isConnected() {
return this.connected;
}
public SocketHandlerBase getHandler() {
return this.handler;
}
}
我调用的服务器很难找到问题。一个非常具体的调用参数配置导致二进制侦听器未被调用。这里一般不涉及 Jetty 客户端或 WebSockets。