我有一个使用 Jetty WebSocket Client 版本 9.x 的 Java 应用程序。它适用于从服务器发送的文本消息,但永远不会调用二进制侦听器。我有一个 Javascript 客户端实现,我基本上是在复制它。我在 Javascript 中执行与在 Java 中执行相同的操作,调用同一台服务器。Javascript 可以工作,而 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;
}
}