Jetty WebSocket クライアント バージョン 9.x を使用する Java アプリがあります。サーバーから送信されたテキスト メッセージに対しては正常に機能しますが、バイナリ リスナーは呼び出されません。基本的に複製しているJavascriptクライアントの実装があります。Java で行うのとまったく同じことを Javascript で行っており、同じサーバーを呼び出しています。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;
}
}