我有一个Java应用程序,使用Jetty WebSocket客户端,版本9.x。对于从服务器发送的文本消息,它可以正常工作,但永远不会调用二进制侦听器。我有一个Javascript客户端实现,基本上是复制的。我在Javascript中做的和在Java中做的完全一样,调用相同的服务器。Javascript可以工作,而Java不行。所以我认为在Jetty中没有正确配置二进制侦听器。
例如,服务器正在发送blob数据。我知道在Javascript客户端中,我可以将binarytype设置为arraybuffer或blob。我认为Jetty中可能需要类似的设置,但我查看了所有API并在网上搜索了许多示例。网上很少有二进制侦听器的例子,也没有任何地方提到设置binarytype,或任何其他使二进制侦听器工作所需的特殊设置。
这是我的代码的统一表示。代码分布在不同的类中,所以这不是一个独立的应用程序,但我认为它显示了我在做什么。服务器端使用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。