У меня есть приложение 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;
}
}