2014-09-26 3 views
3

Использование Ning для создания и подключения к WebSocket, после моя конфигурация,Ning: Подключение к WebSocket и ждать ответа

NettyAsyncHttpProviderConfig config = new NettyAsyncHttpProviderConfig(); 
config.addProperty(NettyAsyncHttpProviderConfig.USE_BLOCKING_IO, "true"); 

AsyncHttpClientConfig.Builder builder = new AsyncHttpClientConfig.Builder() 
       .setAsyncHttpClientProviderConfig(config); 

AsyncHttpClient client = new AsyncHttpClient(
       new NettyAsyncHttpProvider(builder.build())); 

AsyncHttpClient.BoundRequestBuilder requestBuilder = client.prepareGet(createUri(method)) 
       .addHeader(HttpHeaders.Names.CONNECTION, "Upgrade") 
       .addHeader(HttpHeaders.Names.UPGRADE, "WebSocket"); 

websocket = requestBuilder.execute(new WebSocketUpgradeHandler.Builder() 
       .addWebSocketListener(this).build()).get(); 

с помощью WebSocket отправить текстовое сообщение,

if (websocket!=null && websocket.isOpen()) 
     websocket.sendTextMessage(jObj.toString());// send 

onMessage() метод слушатель добавит ответ в список

@Override 
public void onMessage(String message) { 
    serverResponse.add(message); 
} 

После отправки текста мне Ssage, у меня есть метод, который форматирует ответ и сохранить результат

result = responseFromServer();

private String responseFromServer() { 
    String response = null; 
    sleep(100); 
    if(!serverResponse.isEmpty()) 
     //format the message which is added in list 
    return response; 
} 

вопрос, если я не имею «сна (100)» в указанном выше способе, для request1- ответ утратившим для request2, я получаю ответ1. Я хотел бы, чтобы websocket работал как синхронный, так что, как только я отправлю сообщение, он должен ждать unitll, полученный ответ и вперед! Какие-либо предложения!

ответ

5

Использование wait и notify на объекте,

synchronized (someObject){ 
    try { 
    someObject.wait(); 
    result = responseFromServer(); 
    } catch (InterruptedException e) { 
     //when the object is interrupted 
    } 
} 

и onMessage уведомляет объект, как только вы получили сообщение,

@Override 
public void onMessage(String message) { 
    serverResponse.add(message); 
    synchronized(someObject) { 
      someObject.notify(); 
    } 
} 
+0

это работает для меня! Благодаря! – user1609085

+1

@sssV вы можете уточнить, что такое «некоторый объект» в этом случае? – Tito

1

Вы можете также использовать концепцию CountDownLatch, как показано в ссылке ниже:

@ClientEndpoint 
public class WordgameClientEndpoint { 

    private static CountDownLatch latch; 

    private Logger logger = Logger.getLogger(this.getClass().getName()); 

    @OnOpen 
    public void onOpen(Session session) { 
     // same as above 
    } 

    @OnMessage 
    public String onMessage(String message, Session session) { 
     // same as above 
    } 

    @OnClose 
    public void onClose(Session session, CloseReason closeReason) { 
     logger.info(String.format("Session %s close because of %s", session.getId(), closeReason)); 
     latch.countDown(); 
    } 

    public static void main(String[] args) { 
     latch = new CountDownLatch(1); 

     ClientManager client = ClientManager.createClient(); 
     try { 
      client.connectToServer(WordgameClientEndpoint.class, new URI("ws://localhost:8025/websockets/game")); 
      latch.await(); 

     } catch (DeploymentException | URISyntaxException | InterruptedException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 

https://blog.openshift.com/how-to-build-java-websocket-applications-using-the-jsr-356-api/