send() 는 문자열만 받지 않아
ws.send() 에는 텍스트 프레임이 되는 문자열뿐 아니라 ArrayBuffer, Blob, Uint8Array 같은 형식화 배열 도 보낼 수 있어. 이들은 바이너리 프레임이 되고, 프레임 구성은 브라우저가 맡아. API 수준에는 조각 나누기가 없어서 send() 한 번이 논리적 메시지 하나가 돼.
기본 전송 형식은 JSON 이야
애플리케이션의 95% 는 전송 형식으로 JSON 을 써. 보낼 때 문자열로 직렬화하고 받을 때 역직렬화하지. 여기에 type 필드(트랙 5) 를 결합하면 꽤 쓸 만한 애플리케이션 프로토콜이 완성돼.
바이너리 형식과 DataView
게임 상태, 시장 데이터, 사용자 지정 프로토콜처럼 전송 형식을 작게 유지해야 한다면 ws.binaryType = 'arraybuffer' 를 설정해 바이너리를 Blob 대신 ArrayBuffer 로 받아. 그러면 DataView 로 정해진 바이트 위치에서 자료형이 있는 값을 읽고 쓸 수 있어. 위치 갱신 하나가 JSON 에서는 50바이트를 넘기지만 바이너리로는 8~16바이트면 되니 차이가 커.
bufferedAmount 와 역압
네트워크가 내보낼 수 있는 속도보다 더 빨리 보내면 바이트가 ws.bufferedAmount 에 쌓여. 모두 빠졌다고 알려 주는 콜백은 없으니 직접 주기적으로 확인해야 해. 대부분의 앱에는 문제가 없지만 커서나 위치를 빠르게 뿌리는 앱이라면 bufferedAmount 가 몇 KB 를 넘을 때 전송 속도를 제한해야 해.