Java-WebSocket在侦听器之外获取响应

时间:2018-11-26 21:03:31

标签: java websocket

我不知道这个问题。我有一个WebSocket,我想在WebSocket对象之外发出请求并获得响应,但是我只能在WebSocket对象侦听器内访问响应。

我可以在侦听器中完成所有逻辑,但是我只想获取一个String并在主线程中对其进行处理。

我正在使用nv-websocket-client作为WebSocket库。

这是我的示例代码:

WebSocket webSocket = new WebSocketFactory()
    .createSocket(URL, TIMEOUT)
    .addListener(new WebSocketAdapter(){
          @Override
          public void onTextMessage(WebSocket websocket, String text) throws Exception {
               super.onTextMessage(websocket, text);

               // TODO: pass result to function sendCommand()
          }
    })
    .connect()

public String sendCommand(String command) {
    webSocket.sendText(command);

    // TODO: return result;
}

谢谢!

1 个答案:

答案 0 :(得分:1)

您要实现的基本上是等待异步操作完成,然后返回到调用方。您将请求发送到服务器,您将无法知道答案何时返回(如果有的话)。您正在使用的代码实现了回调机制来表示完成状态-这意味着只要发生​​任何事情(在您的情况下,您就会收到服务器的响应),只需调用您在适配器中实现的方法即可。

CompletableFuture是做这种事情的理想人选。 Future是用于获取可能在将来完成的结果的接口。 .get()方法将阻塞调用线程,直到结果可用为止。我的想法是创建一个自定义适配器,您将使用它与服务器进行通信(发送数据和从服务器接收数据):

class MyWebSocketAdapter implements WebSocketAdapter {
   // Store the responseFuture as a member of the adapter. 
   private CompletableFuture<String> responseFuture;

   public String sendCommand(String command) {
       // CompletableFutures can only be "used" once, so create a new object
       responseFuture = new CompletableFuture<String>();
       webSocket.sendText(command);
       // Keep in mind potential errors and a timeout value to this call
       return responseFuture.get();
   }

   @Override
   public void onTextMessage(WebSocket websocket, String text) throws Exception {
      super.onTextMessage(websocket, text);
      // Do what you want to do with the text and then complete the future
      responseFuture.complete(text);
   }
}

请注意,您将需要为创建的每个套接字创建一个新的适配器。如果将同一个对象传递给多个套接字,则会出现并发问题,因为只有一个套接字可以写入responseFuture

此外,如果您不熟悉异步编程,建议您仔细阅读一下,它通常会使并发管理起来更容易一些,并且核心概念与语言无关,并且许多语言都有库或内置库。支持它。这是java的简介。


免责声明:我目前尚未安装Java IDE,因此无法编译它,距离我使用Java已经有一段时间了,但是希望对您有所帮助:)。