Jetty WebSocket 客户端不适用于二进制侦听器



我有一个Java应用程序,使用Jetty WebSocket客户端,版本9.x。对于从服务器发送的文本消息,它可以正常工作,但永远不会调用二进制侦听器。我有一个Javascript客户端实现,基本上是复制的。我在Javascript中做的和在Java中做的完全一样,调用相同的服务器。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;
   } 
}

我呼叫的服务器有一个很难发现的问题。调用参数的一个非常特定的配置导致无法调用二进制侦听器。这里不涉及Jetty客户端或WebSockets。

最新更新