0

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;
   } 
}
4

1 に答える 1

0

私が呼び出していたサーバーに見つけにくい問題がありました。呼び出し引数の非常に特殊な構成が原因で、バイナリ リスナーが呼び出されませんでした。ここでは、Jetty クライアントや WebSocket に関する一般的な情報はありません。

于 2015-06-09T23:56:50.707 に答える