我有一个使用Jetty WebSocket Client版本9.x的Java应用程序。它适用于从服务器发送的文本消息,但从不调用二进制侦听器。我有一个Javascript客户端实现,我基本上复制。我在Javascript中使用Java做同样的事情,调用相同的服务器。 Javascript有效,Java也没有。因此,我认为在Jetty中没有为二进制侦听器正确配置某些内容。
例如,服务器正在发送blob数据。我知道在Javascript客户端中,我可以将binarytype设置为arraybuffer或blob。我想Jetty可能需要类似的设置,但是我已经查看了API并在网上搜索了很多例子。在线的二进制监听器的例子很少,并且没有提到设置二进制类型的任何地方,或者使二进制llistener工作所需的任何其他特殊设置。
这是我的代码的综合表示。代码遍布各个类,因此这不是一个独立的应用程序,但我认为它显示了我正在做的事情。服务器使用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;
}
}
答案 0 :(得分:0)
我正在调用的服务器很难找到问题。调用参数的一个非常具体的配置导致不调用二进制侦听器。这里没有关于Jetty客户端或WebSocket的任何内容。