2016-10-21 2 views
0

저는 서버와 여러 대의 클라이언트 장치가 있습니다. 모든 장치에서 우분투 OS가 실행 중입니다. 서버에 ExpressJs 기반 노드 응용 프로그램이 있습니다. 클라이언트 장치의 온라인 상태를 추적하려고합니다.컴퓨터의 온라인 상태를 확인하는 가장 좋은 방법은 무엇입니까?

서버의 NodeJs 응용 프로그램은 SocketIO를 통해 수신/게시 종점 및 웹 소켓과 통합됩니다. 서버가 인터넷에 공용 IP를 가지고 있으며 장치에 공용 IP가 없습니다.

클라이언트 장치에는 웹 소켓을 통해 서버와 통신 할 수있는 작은 응용 프로그램이 있으며 API 호출을 보낼 수 있습니다.

각 장치의 온라인 상태를 추적하는 가장 좋은 방법은 무엇입니까? 온을 사용하여 주기적으로 서버

  • 에 클라이언트에서 웹 소켓 메시지를 전송함으로써 서버 주기적으로
  • 에 클라이언트 장치에서 API 호출을 전송함으로써

    1. (서버 응용 프로그램, 지연, 신뢰성 등의 성능을 고려) 웹 소켓 호출을 통해 서버에서 장치로 서버에 대한 요청 확인
    2. 다른 접근 방법은 무엇입니까? 설명해주세요.
  • +2

    최적 있지만, "확실한"방법은 "하트 비트"단지 의미 짧고 간단한 신호를 보낼 수있는 각 클라이언트입니다하지 않을 수 있습니다 "나는 아직 살아 있고 연결되어 있습니다"라는 메시지가 주기적으로 표시되고 서버가 하트 비트에 따라 온라인 상태를 업데이트 할 수 있습니다 (한 번 하트 비트가 누락 되었습니까? 아홉 번 연속 되었습니까? 문제가있을 수 있습니다 .10? 장치가 다운되었습니다). 일단 통신 프로토콜을 구현하면 정말 간단합니다. 감사합니다. – DrakaSAN

    +0

    . 그것이 현재 사용하고있는 메커니즘입니다 (ReST 호출을 사용하고 있습니다). 그러나 최근에 저는 서버 응용 프로그램에 표시된 실제 온라인 상태와 온라인 상태 사이에 눈에 띄는 시간 차이가있는 경우를 경험했습니다. –

    답변

    1

    장치에서 서버에 대한 영구 웹 소켓 연결을 열면 socket.io에서 필요한 것을 모두 제공합니다.

    pingTimeoutpingInterval 옵션 here을 참조하십시오.

    예 : 클라이언트가 있기 때문에, "핑 타임 아웃"소켓의 분리 이벤트에 전달 핑 타임 아웃의 연결이 끊어

    var io = require('socket.io')(); 
    io.engine.pingInterval = 5000; // considers the connection closed after 5 seconds without a pong response from the client 
    io.engine.pingTimeout = 3000; // sends a new ping packet after 3 seconds 
    

    는 :

    io.on("connection", function(socket) { 
        socket.on("disconnect", function(socket, e) { 
         // e contains "ping timeout" 
         // possible other values: "transport close" (connection closed by the client) 
         // or "server namespace disconnect" (connection closed by the server) 
        }); 
    }); 
    

    그것은에서 동일합니다 고객.

    reconnection, reconnectionAttempts 등의 클라이언트에서 참조 : http://socket.io/docs/client-api/

    관련 문제