Клиент Jetty WebSocket не работает для двоичного прослушивателя

У меня есть приложение Java, использующее клиент Jetty WebSocket версии 9.x. Он отлично работает для текстовых сообщений, отправленных с сервера, но бинарный прослушиватель никогда не вызывается. У меня есть реализация клиента Javascript, которую я в основном дублирую. Я делаю то же самое в Javascript, что и в Java, вызывая тот же сервер. Javascript работает, а Java нет. Поэтому я думаю, что что-то не настроено должным образом в Jetty для бинарных слушателей.

Например, сервер отправляет данные большого двоичного объекта. Я знаю, что в клиенте Javascript я могу установить двоичный тип либо в 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;
   } 
}

person MidnightJava    schedule 21.05.2015    source источник


Ответы (1)


Было трудно найти проблему с сервером, на который я звонил. Очень специфическая конфигурация аргументов вызова приводила к тому, что бинарный прослушиватель не вызывался. Здесь ничего не говорится о клиенте Jetty или WebSockets в целом.

person MidnightJava    schedule 09.06.2015
comment
Вы должны хотя бы объяснить, в чем была проблема, чтобы люди вели в правильном направлении при чтении поста. - person kevr; 14.09.2017