IT用語辞典バイナリ | さくいん | サイトマップ | ヘルプ | お気に入りに追加  
HTML5 JavaScript API
IT用語辞典バイナリ<パソコン用語・コンピュータ辞書>
コンピュータ偉人伝<人物・画像・写真・プログラミング>
コンピュータ偉人伝<人物・画像・写真・プログラミング>
コンピュータ偉人伝<人物・画像・写真・プログラミング>
拡張子辞典<ファイル・変換・変更・表示>
HTML5タグリファレンス
CSS3リファレンス
HTML5 JavaScript API
エクセル関数リファレンス
ITパスポート試験
 
  
  IT用語辞典バイナリ > HTML5 JavaScript API > WebSocketの使い方 > サーバー側を実装するには?
  カテゴリ別さくいん

サーバー側を実装するには?

サーバー側を実装するには

解説

サーバー側を実装する場合、通常、ウェブサーバーや、フレームワーク、ライブラリ等による通信プロトコル実装を利用して開発を行います。

ここでは、JavaサーブレットコンテナであるJetty 8 での実装を例に説明を行います。サーバー側のAPIに関しては共通の規約は存在しませんが、イベント駆動モデルで実装がされている場合は、クライアント側とほぼ共通するイベントに対してコールバック関数を定義するという点で、それほど大きな違いはありません。

実装によっては、Jettyのようなイベント駆動モデルの抽象化がされておらず、通信プロトコルの生データに近いレベルを取り扱わなければならない場合がありますが、この記事の範囲を超えますので詳細には触れません。

Jetty 8 での実装では、org.eclipse.jetty.websocket.WebSocketServletクラスを継承するクラス実装し、サーブレットとして公開することで、比較的容易にWebSocketを使用するウェブアプリケーションを作成することができます。

このサーブレットのdoWebSocketConnectメソッドで、WebSocketインターフェイス実装したクラスインスタンス化して返すことで、WebSocketプロトコルでの実際の通信を担当するクラスを指定します。

複数のサブプロトコルが送られてきた場合は、このメソッドがサブプロトコルの数だけ呼ばれますが、nullでない戻り値を返した時点でそのサブプロトコルが選ばれたことになり、以降は候補がまだ残っていても呼ばれません。

public class MyServlet extends WebSocketServlet{
   public WebSocket doWebSocketConnect(HttpServletRequest request, String protocol) {
       if ("protocolA".equals(protocol)){
           // WebSocketインターフェイス実装クラスA
           return new MySocketA();
       } else if ("protocolB".equals(protocol)){
           // WebSocketインターフェイス実装クラスB
           return new MySocketB();
       } else {
           return null;
       }
   }
}

WebSocketインターフェイスには、接続開始と切断のイベントハンドラが、WebSocketインターフェイスを継承した、OnTextMessageインターフェイスやOnBinaryMessageインターフェイスには、メッセージ受信のイベントハンドラが定義されています。

実際のWebSocket通信を担当するクラスでは、必要になるイベントに応じてWebSocketインターフェイス、またはその継承インターフェイス実装します。

class MySocket
   implements WebSocket.OnTextMessage, WebSocket.OnBinaryMessage{

   public void onOpen(Connection connection){
       // WebSocketインターフェイスで定義
       // 接続開始。クライアント側のonopenイベントに対応。
   }

   public void onClose(int closeCode , String message){
       // WebSocketインターフェイスで定義
       // 切断。クライアント側のoncloseイベントに対応。
       // closeCodeはステータスコード、messageは切断理由。
   }

   public void onMessage(String data){
       // WebSocket.OnTextMessageインターフェイスで定義
       // テキストデータを受け取った時に呼ばれる。
   }

   public void onMessage(byte[] data, int offset, int length){
       // WebSocket.OnBinaryMessageインターフェイスで定義
       // バイナリーデータを受け取った時に呼ばれる。
   }
}

WebSocketインターフェイス実装クラスクライアントとの間に維持されている接続の数だけインスタンス化されます。クライアントとのそれぞれの接続はonOpenイベントの引数であるConnectionインターフェイス実装クラスが表しています。

Connectionインターフェイスには以下のようなメソッドがあり、これを使用して、クライアントとの接続を制御します。

// テキストデータ送信
void sendMessage(String data) throws IOException

// バイナリーデータ送信
void sendMessage(byte[] data,int offset,int length) throws IOException

// 接続を閉じる
void disconnect()

クライアント側と異なり、プロトコルの詳細に関連したメソッドイベントサーバー側には存在しますが、ここでは詳しく触れません。

以上のように、発生するイベントや引数については、ほぼクライアント側APIに準じた考え方で開発を行うことができますが、一つ大きく異なるのは、サーバー側では同時に接続している複数のクライアントを考慮する必要があるという点です。

Jetty 8 の実装では、WebSocketインターフェイス実装クラスは、クライアントとの接続の数だけインスタンス化されるため、特定のクライアントから送られてきたデータをほかのクライアントに送るためには、ほかのクライアントとの接続を表すインスタンスへの参照をなんらかの形で保持し、切断された接続への参照は削除するという接続リストの管理が必要になります。

// socketListはWebSocketインターフェイス実装クラスMyWebSocketのリスト
// MyWebSocketクラスには接続をあらわすmConnection属性を定義しておく

for(MyWebSocket socket : socketList){
    try{
        // すべてのクライアントに送信
        socket.mConnection.sendMessage(data); 
    } catch (IOException e) {
        e.printStackTrace();
    }
}

関連項目




V20 PRO L-01JV20 PRO L-01J
NTTドコモが販売するスマートフォン。
Withings Steel HRWithings Steel HR
フランスの家電メーカー・Withingsが販売するスマートウォッチ。
Disney Mobile on docomo DM-01JDisney Mobile on docomo DM-01J
NTTドコモが販売するスマートフォン。

 ・ITパスポート試験とは
 ・試験範囲と内容
 ・サンプル問題にチャレンジ

 ・Windowsの歴史
ジョン・マッカーシー LISPの開発者
ジョン・マッカーシー
人工知能の研究分野における第一人者。
スティーブ・ジョブズ Appleの共同創設者
スティーブ・ジョブズ
「Mac」や「iPhone」を生み出した経営者。
デニス・リッチー C言語、UNIXの開発者
デニス・リッチー
C言語の設計、UNIXの開発に携わった人物。
».m4b MPEG-4オーディオファイルの拡張子。 up!
».m4r iPhoneの着メロにするAACファイルにつく拡張子。 up!
».xlsx Excel 2007で作成したファイルのデフォルトの拡張子。
».docx Word 2007の標準的な保存形式。XML形式となっている。

2017年2月25日現在
ランキング1   ICT (用語辞典)
ランキング2   セグメント (用語辞典)
ランキング3   リマインダー  (用語辞典)
ランキング4   スワイプ  (用語辞典)
ランキング5   プラットフォーム  (用語辞典)
ランキング6   リーンスタートアップ  (用語辞典)
ランキング7   デプロイ  (用語辞典)
ランキング8   アクティブユーザー  (用語辞典)
ランキング9   サードパーティ  (用語辞典)
ランキング10   パーマリンク  (用語辞典)
RSS 0.91 RSS 1.0 RSS 2.0
IT用語辞典バイナリについてウェブリオ株式会社についてお問い合わせ先テクニカルライター募集利用規約
プライバシーポリシー著作権・商標について協力社一覧Weblio 辞書スマート翻訳英和辞典 - Weblio辞書Weblio英会話
©2012 Weblio, Inc. All rights reserved.