2016-12-22 11 views
0

Я использую WebSocket для обеспечения связи между двумя автономными банками. Первый запускает встроенный Jetty и развертывает WebSocket, а второй - клиент Jetty WebSocket, который отправляет команды и ждет обработки серверной части.Как обнаружить соединение, потерянное с помощью Jetty WebSocket

Сервер:

import java.io.IOException; 

import javax.websocket.*; 

@ClientEndpoint 
@ServerEndpoint(value = "/websocket-api", encoders = {  NotificationEncoder.class }, decoders = { NotificationDecoder.class }) 
public class APIWebsocket { 

    private static final Logger log = LoggerFactory.getLogger(APIWebsocket.class); 

    @OnOpen 
    public void open(Session session) { 
    log.info("Session opened..."); 

    } 

    @OnClose 
    public void close(Session session) throws IOException { 
    session.close(); 
    log.info("Session closed !"); 
    } 

    @OnError 
    public void onError(Throwable error) { 
    log.error("Error during websocket session : {}", error.getMessage()); 
    log.debug("{}", error); 
    } 

    @OnMessage 
    public void handleMessage(String message, Session session) { 

     log.info("Message received : {}", message); 

     List<Data> datas = JSONHelper.toCollection(message); 
     for (Data data : datas){ 
      // do process with average time 30sec... 
      // send notification of processing 
      Notification unitNotification= new Notification("PROCESSED"); 
      session.getBasicRemote().sendObject(unitNotification); 
     } 

     // Build and send end notification message 
     Notification endProcessNotification = new Notification("END OF PROCESS"); 
     session.getBasicRemote().sendObject(endProcessNotification); 

    } catch (EncodeException | IOException e) { 
     log.error(e.getMessage(), e); 
     // Manage error 

    } finally { 
     try { 
     session.close(); 
     } catch (IOException e) { 
     log.error(e.getMessage(), e); 
     // Manage error 
     } 

    } 

    } 

} 

Клиент:

import java.io.IOException; 
import java.net.URI; 

import org.eclipse.jetty.websocket.api.Session; 
import org.eclipse.jetty.websocket.api.WebSocketAdapter; 
import org.eclipse.jetty.websocket.client.WebSocketClient; 


public class WebsocketClient extends WebSocketAdapter { 

    private static final Logger log = LoggerFactory.getLogger(WebsocketClient.class); 
    private Session session = null; 

    public APIWebsocketClient(String uri) { 
    try { 
     WebSocketClient client = new WebSocketClient(); 
     client.setMaxIdleTimeout(35 * 1000L); 

     client.start(); 
     client.connect(this, new URI(uri)).get(); 

    } catch (Exception e) { 
     log.error(e.getMessage(), e); 
    } 

    } 

    public void startProcess(String datas) { 
    try { 
     session.getRemote().sendString(datas); 
    } catch (IOException e) { 
     log.error(e.getMessage(), e); 
    } 
    } 

    @Override 
    public void onWebSocketText(String message) { 
    log.info("Message received : {}", message); 
    } 

    @Override 
    public void onWebSocketClose(int statusCode, String reason) { 
    log.info("Websocket closed ! [statusCode={}, reason={}]", statusCode, reason); 
    this.session.close(); 
    } 

    @Override 
    public void onWebSocketConnect(Session session) { 
    this.session = session; 
    log.info("Websocket Client details : {}-{}", session.getLocalAddress().getHostName(), session 
     .getLocalAddress().getAddress().getHostAddress()); 
    } 

    @Override 
    public void onWebSocketError(Throwable cause) { 
    log.error("Error during websocket execution : {}", cause.getMessage(), cause); 

    if (this.session != null) { 
     this.session.close(); 
    } 
    } 

} 

Моя цель состоит в том, чтобы обнаружить, если сеть связи теряется между клиентом и сервером. Если я смоделирую потерю сети, отключив сетевой провод, WebSocket должен обнаружить ошибку связи на сервере и на стороне клиента.

У вас есть идеи, как я могу продолжить обнаружение потери сети между клиентом и сервером?

ответ

-1

Это Java.

Соединение потеряно только при событии чтения/записи. Не потере физической сети.

Если вы используете Android, то для определения состояния сети существуют специальные API для Android.

+0

Серверная часть выполняет несколько операций обработки и должна отправлять состояние каждой обработки отдельно (вы можете проверить обновленный исходный код сервера) В настоящее время, когда я пытаюсь имитировать потерю сетевого соединения, часть сервера продолжает делать его обработка и возвращает все к возобновлению соединения, если webscoket еще не закрыт. Мой вопрос: почему к потере соединения, событие @OnError не уволено? Когда вы говорите «Это Java», вы имели в виду, что мы должны добавить нашу логику для обработки потери связи? –

+0

Потеря сетевого соединения в java обнаруживается только при выполнении фактического сетевого ввода-вывода. если соединение (и попытки использования соединения) простаивают, то нет события, указывающего на потерю соединения. –