programing

브라우저에서 웹소켓 핑/퐁 프레임 전송

closeapi 2023. 10. 13. 22:15
반응형

브라우저에서 웹소켓 핑/퐁 프레임 전송

연결을 유지하기 위해 웹 소켓에서 핑/퐁 메시지를 계속 읽지만 무엇인지 잘 모르겠습니다.프레임 타입이 다른 건가요?(ping-pong과 관련된 chrome의 javascript WebSocket 객체에서는 어떠한 메소드도 보이지 않습니다.)아니면 그냥 디자인 패턴(예: 말 그대로 "ping"이나 다른 문자열을 서버에 보내고 응답하게 하는 것)일까요?탁구는 연속 프레임과 관련이 있습니까?

제가 물어보는 이유는 제가 Mongrel2 뒤에서 실행되는 python 프레임워크를 사용하고 있기 때문입니다. 그래서 제 python app에서 걱정할 필요 없이 연결을 유지하도록 알려주는 특정 ping/pong 메시지를 Mongrel2에 보낼 수 있는 방법이 있는지 궁금합니다.별도의 HTTP 방식을 사용하는 것과 유사합니다.그리고 전용 ping/pong 메시지 프레임이 문자열 "ping"보다 더 간단할 수도 있다고 생각합니다(서버 및 네트워크의 부하가 적을 수도 있습니다). 하지만 그것이 크게 중요하지는 않을 것입니다.

편집: 방금 RFC 6455를 봤는데 핑과 퐁은 분명히 자체 opcode를 가진 컨트롤 프레임 타입인 것 같습니다.그렇다면 chrome에서 javascript에서 ping frame을 어떻게 보내나요?

핑 프레임을 보내거나 퐁 프레임을 받을 수 있는 자바스크립트 API가 없습니다.이것은 브라우저에서 지원되거나 지원되지 않습니다.또한 브라우저가 ping/pong 프레임을 지원하고 사용하고 있는지 여부를 활성화, 구성 또는 감지할 수 있는 API가 없습니다.이를 위한 자바스크립트 ping/pong API 제작에 대한 논의가 있었습니다.향후 ping을 설정/검출할 수 있는 가능성이 있으나, 자바스크립트가 ping/pong 프레임을 직접 송수신할 수 있을 것 같지는 않습니다.

그러나 클라이언트와 서버 코드를 모두 제어하면 더 높은 수준에서 쉽게 핑/퐁 지원을 추가할 수 있습니다.메시지 유형 헤더/메타데이터가 아직 없다면 메시지 유형 헤더/메타데이터가 필요하겠지만, 이는 매우 간단합니다.초당 수백 번의 ping 전송을 계획하고 있거나 동시에 수천 개의 클라이언트를 보유하고 있지 않는 한, 직접 전송하기에는 오버헤드가 매우 적을 것입니다.

업데이트: 비록 답은 오래되었지만, 구글의 상위 결과에 있습니다.악수 후 어느 시점에서 클라이언트 또는 서버는 상대방에게 ping을 전송하도록 선택할 수 있습니다.

ping은 서버에서 클라이언트로만 전송되며 브라우저는 Pong OpCode로 가능한 한 빨리 응답해야 합니다.그래서 당신은 더 높은 차원에서 그것에 대해 걱정할 필요가 없습니다.

모든 브라우저가 표준을 지원하는 것은 아니지만 그러한 메커니즘을 구현하는 데 약간의 차이가 있을 수 있으며 심지어 Pong 응답 기능이 없음을 의미할 수도 있습니다.하지만 저는 개인적으로 핑/퐁을 사용하고 있으며, 낮은 레벨의 클라이언트 측 구현에서 이러한 유형의 OpCode와 자동 응답을 구현하지 않는 클라이언트를 본 적이 없습니다.

js로 가능한 해결책

가 WebSocket 을 끊은 ws링크 몇 분 후 서버와 클라이언트 사이에 메시지가 전송되지 않았습니다.

  1. 클라이언트 엔드 이니셔티브가 사용자 정의를 전송합니다.ping,keepAlive기능

  2. 합니다를 합니다.ping 지정합니다에 합니다.pong

let timerId = 0; 

function keepAlive(timeout = 20000) { 
    if (webSocket.readyState == webSocket.OPEN) {  
        webSocket.send('');  
    }  
    timerId = setTimeout(keepAlive, timeout);  
}

function cancelKeepAlive() {  
    if (timerId) {  
        clearTimeout(timerId);  
    }  
}

아니요.

핑을 구현하려고 했습니다.브라우저 웹소켓 클라이언트에게 0x1(스트링)과 0x2(바이너리) 이외의 opcode를 강제로 설정할 수 있는 방법은 없는 것 같습니다.

const socket = new WebSocket(url);
ping() {
    if (socket?.readyState !== WebSocket.OPEN) {
      return;
    }
    const buffer = new ArrayBuffer(7);
    const dataView = new DataView(buffer);
    dataView.setInt8(0, 0x89);
    dataView.setInt8(1, 0x00);
    dataView.setInt8(2, 0x48);
    dataView.setInt8(3, 0x65);
    dataView.setInt8(4, 0x6c);
    dataView.setInt8(5, 0x6c);
    dataView.setInt8(6, 0x6f);
    socket.send(buffer);
  }
socket.addEventListener('open', ping);

이 코드는 본문이 "hello"인 최종(0x8) 핑 프레임(opcode 0x09)을 전송해야 하지만 브라우저는 본문이 "hello"인 이진법(0x82)으로 최종 프레임을 전송합니다. 여기서 �는 0x89 데이터입니다.

언급URL : https://stackoverflow.com/questions/10585355/sending-websocket-ping-pong-frame-from-browser

반응형