我不知道这个问题。我有一个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;
}
谢谢!
答案 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已经有一段时间了,但是希望对您有所帮助:)。