クライアント側からデータの処理方式を指定するには?
解説
ファイルの送受信を行う場合と、チャットで発言を送受信する場合とでは、データの内容や書式、エンコード、デコードの方式も違う方が効率的です。こういった場合、サブプロトコルの指定を行います。
サブプロトコルはWebSocket通信プロトコルの挙動ではなく、その上で送受信されるデータの取り扱いに関する、アプリケーション同士での取り決めです。
サブプロトコルの指定は、WebSocketオブジェクトのコンストラクター「WebSocket(url,[protocol])」の省略可能な第2引数protocolで行います。
引数protocolは文字列か、文字列の配列で、サブプロトコルの名前を指定します。配列形式で複数のサブプロトコルを指定した場合、サーバー側はそのうちサポートしているものを一つ選択します。
サーバー側で選択されたサブプロトコルは、WebSocketオブジェクトのprotocol属性に格納されます。サーバーが、クライアントが指定したサブプロトコルをサポートしていなかった場合、接続は失敗します。
サブプロトコル名はUS-ASCIIの範囲に制限されており、全角文字などは使用できません。
// infoは情報表示用のdiv要素
var ws = new WebSocket("ws://example.com/app",["chatA","chatB"]);
var ws2 = new WebSocket("ws://example.com/app","file");
function chatHanlder(event){
var protocol = event.target.protocol;
if(protocol == "chatA"){
//chatAサブプロトコルの場合の処理
} else if(protocol == "chatB"){
//chatBサブプロトコルの場合の処理
}
}
function fileHanlder(event){
//fileサブプロトコルの場合の処理
}
ws.onmessage = chatHanlder;
ws2.onmessage = fileHanlder;
SafariとOperaでは、コンストラクタの引数としてサブプロトコルを受け付けはしますが、サーバーがどのサブプロトコルを選択したかを示すWebSocketオブジェクトのprotocol属性が存在せず、この属性を利用して処理を分けることはできません。
関連項目