티스토리 뷰
발생일: 2013.05.28
문제:
WebSocket API 스펙을 보며 정리했던 메모
문제:
WebSocket API 스펙을 보며 정리했던 메모
해결책:
WebSocket API Specification
bufferedAmount
send()로 추가한 데이터 중 아직 전송되지 않고 버퍼된 양
binaryType
개발자가 데이터를 어떤 방식으로 사용할 지 결정할 수 있게 한다.
기본 생성되면 "blob"로 저장되며, "blob" 또는 "arraybuffer" 중 선택할 수 있다.
"blob"이면 파일에 저장하는 게 낫고, "arraybuffer"면 메모리에 쓰는 게 낫다.
send(data)
if data is a string
데이터를 유니코드 텍스트로 변환한다.
에러가 발생하지 않았다면, bufferedAmount의 값이 UTF-8로 변환했을 때의 바이트만큼 증가한다.
스펙에서는 UA가 text frame opcode로 구성해서 보내야 한다고 한다.
아마도 이때 문자열의 시작과 끝에 0x00과 0xFF가 추가되지 않을까?
if data is a Blob object
UA는 데이터를 binary frame opcode로 구성해서 보내야 한다.
전달되는 데이터는 로우 바이너리 데이터 형식인 Blob 객체이다.
마찬가지로 메서드가 호출될 때마다 bufferedAmount의 값이 로우 데이터 사이즈만큼 늘어난다.
if data is an ArrayBuffer object
binary frame opcode로 구성한다.
ArrayBuffer의 바이트 길이만큼 bufferedAmount의 값이 증가된다.
if data is an ArrayBufferView object
binary frame opcode로 구성한다.
ArrayBuffer와 동일, 대신 ArrayBufferView 객체를 리턴한다.
이벤트 타입
웹소켓에서 사용하는 핸들러와 타입은 다음과 같다.
onopen / open
onmessage / message
onerror / error
onclose / close
커넥션이 연결되는 아래와 같은 순서로 진행된다.
1. readyState 속성이 OPEN으로 설정된다.
2. extensions 속성을 설정하고 없다면 null로 설정한다.
3. protocol 속성을 설정하고 없다면 null로 설정한다.
4. 핸드쉐이킹 과정에서 설정해야할 쿠키 문자열을 받았다면, 웹소켓 객체를 생성할 때 사용했던 URL의 쿠키로 설정한다.
5. open 이벤트를 발생한다.
UA는 다음 상황에서 에러 발생 시 별도의 오류 메시지를 제공하면 안된다.
- 호스트 네임으로 서버에 접속할 수 없을 때
- 패킷이 올바르게 라우팅 되지 않았을 때
- 전달한 포트로 접속에 실패했을 때
- 서버 인증서가 검증되지 않는 등으로 핸드쉐이킹에 실패했을 때
- 핸드쉐이킹엔 성공했지만, 서버의 하위 프로토콜을 클라이언트에서 받아들이지 않는 등의 원인으로 클라이언트에서 연결이 끊어졌을 때
- 핸드쉐이킹 이후에 갑자기 연결이 끊어졌을 때
이 경우에는 에러 코드만 1006으로 응답하고, 자세한 메시지를 제공하지 않는다.
자세한 원인을 알려주면, 보안의 위험이 있기 때문이다.
CloseEvent
wasClean 속성: 커넥션이 올바르게 끊어졌는지를 나타내며, 객체가 생성되면 false로 초기화된다.
code 속성: 웹소켓이 종료될 때의 종료 코드이며, 객체가 생성되면 0으로 초기화된다.
reason 속성: 서버에서 주는 종료 메시지로, 객체가 생성되면 빈 문자열로 초기화된다.
Garbage collection
소켓 객체의 readyState가 0이고, opne, message, error, close 이벤트 핸들러가 등록돼 있으면 가비지 컬렉팅 하지 않는다.
마찬가지로, readyState가 1이고, message, error, close가,
readyState가 2이고, error, close 이벤트 핸들러가 할당돼 있으면 컬렉팅하지 않는다.
연결되어 있는 객체가 가비지 컬렉트될 때엔, 반드시 status code 없이 closing 핸드쉐이크를 진행해야 한다.
반응형
댓글
공지사항