Java WebSocket:onMessage 未触发

Posted

技术标签:

【中文标题】Java WebSocket:onMessage 未触发【英文标题】:Java WebSocket: onMessage is not triggered 【发布时间】:2017-09-21 11:53:13 【问题描述】:

我用这个code 用java 编写了websocket 客户端。这是一个安全的插座。与目的地的连接建立良好,但未调用 onMessage。

当我在 java 脚本中编写相同的东西时,它正在工作并且能够得到响应。

请检查我的代码并告知我在这里遗漏了什么。

我的代码:

@ClientEndpoint
public class MyClientEndpoint 
    @SuppressWarnings("unchecked")

    @OnOpen
    public void onOpen(Session session) 
        System.out.println("Connected to endpoint: " + session.getBasicRemote());
        try 
            JSONObject obj = new JSONObject();
            obj.put("subscribe", URLEncoder.encode("xxxxxxx","UTF-8"));
            String msg = obj.toJSONString();
            System.out.println("Sending message to endpoint: " + msg);
            session.getBasicRemote().sendText(msg);
         catch (Exception ex) 
            Logger.getLogger(MyClientEndpoint.class.getName()).log(Level.SEVERE, null, ex);
        
    

    @OnMessage
    public void onMessage(String message) 
    System.out.println("Received message in client: " + message);
        Client.messageLatch.countDown();
    



public class Client 

    final static CountDownLatch messageLatch = new CountDownLatch(1);

    public static void main(String[] args) 
        try 
        WebSocketContainer container = ContainerProvider.getWebSocketContainer();
            String uri = "wss://api.....";
            System.out.println("Connecting to:: " + uri);
            container.connectToServer(MyClientEndpoint.class, URI.create(uri));
            messageLatch.await(10, TimeUnit.SECONDS);            
         catch (DeploymentException | InterruptedException | IOException ex) 
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
        
    

【问题讨论】:

您的@OnMessage 中可能缺少Session session 参数。签名应该是public void myMethod(Session session, String message); 尝试将 Session 会话作为该方法的第一个参数,但仍然无法正常工作。 【参考方案1】:

我可以通过传入凭据来连接到安全的 websocket

ClientEndpointConfig.Configurator configurator = new ClientEndpointConfig.Configurator() 
             public void beforeRequest(Map<String, List<String>> headers) 
          String credentials = "username:password";
          headers.put("Authorization", Arrays.asList("Basic " + new BASE64Encoder().encode(credentials.getBytes())));
                 System.out.println("Header set successfully");
             
         ;

         ClientEndpointConfig clientConfig = ClientEndpointConfig.Builder.create()
                 .configurator(configurator)
                 .build();

我在以下链接中记录了这些步骤。

https://bigdatatechbytes.blogspot.in/2017/10/java-client-for-secure-web-socket.html

【讨论】:

以上是关于Java WebSocket:onMessage 未触发的主要内容,如果未能解决你的问题,请参考以下文章

BlockingQueue 失去了它的引用并抛出 NullPointerException onMessage Jetty WebSocket

WebSocket 频繁 onmessage 零拷贝

在 onMessage 注释中具有多个数据的 Websocket

不同的 WebSocket“onmessage”处理程序取决于屏幕

C# 创建 websocket - onmessage 函数不起作用

onMessage WebSocket 中的消息处理