브라우저에서 웹소켓 핑/퐁 프레임 전송
연결을 유지하기 위해 웹 소켓에서 핑/퐁 메시지를 계속 읽지만 무엇인지 잘 모르겠습니다.프레임 타입이 다른 건가요?(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
링크 몇 분 후 서버와 클라이언트 사이에 메시지가 전송되지 않았습니다.
클라이언트 엔드 이니셔티브가 사용자 정의를 전송합니다.
ping
,keepAlive
기능합니다를 합니다.
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
'programing' 카테고리의 다른 글
Listagg 함수 및 ORA-01489: 문자열 연결 결과가 너무 깁니다. (0) | 2023.10.13 |
---|---|
c 프로그램으로 데이터를 플롯하는 방법은? (0) | 2023.10.13 |
나는 C의 malloc()와 calloc()에 대해 매우 혼란스럽습니다. (0) | 2023.10.13 |
MariaDB - JSON 필드에서 Store 값으로 필드 값을 설정하는 방법 (0) | 2023.10.13 |
T-SQL: MAX를 기반으로 컬럼 선택(기타 컬럼) (0) | 2023.10.13 |