Java - WebSocket salir a la calle respuesta del oyente

Hexile:

No puedo entender este problema. Tengo un WebSocket y quiero hacer una solicitud y obtener una respuesta fuera del objeto WebSocket pero sólo puedo acceder a la respuesta dentro del oyente objeto WebSocket.

Podría hacer todo mi lógica dentro del oyente, pero me gustaría sólo para obtener una cadena y procesarlo en el hilo principal.

Estoy usando nv-WebSocket-cliente como mi biblioteca WebSocket.

Aquí está mi código de ejemplo:

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;
}

¡Gracias!

Corodescu párrafo:

Lo que estamos tratando de lograr es básicamente que esperar para la operación asincrónica hasta el final y luego de vuelta a la persona que llama. Te enviará la petición al servidor y no hay manera de saber cuándo la respuesta va a volver (en su caso). El código que está utilizando implementa el mecanismo de devolución de llamada a la terminación de la señal - que significa que cada vez que la sucede algo (en su caso de que reciba una respuesta desde el servidor), simplemente llame al método que se ha implementado en el adaptador.

La clase CompletableFuture es el candidato perfecto para hacer tal cosa. Un futuro es una interfaz utilizada para hacerse con un resultado que puede completar en el futuro. El .get()método bloqueará el subproceso de la llamada hasta que un resultado está disponible. Mi idea es crear un adaptador personalizado que va a utilizar para comunicarse con el servidor (tanto para enviar datos y recibir datos de él):

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);
   }
}

Sin embargo, Aviso que se necesita para crear un nuevo adaptador para cada socket se crea. Si pasa el mismo objeto a más de una toma, tendrá problemas de concurrencia porque sólo una de las tomas se puede escribir en el responseFuture.

Además, si usted no está familiarizado con la programación asincrónica le sugiero que lea sobre esto un poco, por lo general hace que la concurrencia un poco más fácil de manejar y los conceptos básicos son independiente del idioma y un montón de idiomas tienen cualquiera de las bibliotecas o soporte incorporado para eso. Aquí es una introducción para java .


Negación: Actualmente no tengo un IDE Java instalado para que no pudiera compilar y ha sido un tiempo desde que he trabajado con Java, pero espero que esto le ayuda :).

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=238896&siteId=1
Recomendado
Clasificación