Websocketとsocket.ioのあれらの事

6502 ワード

Websocketとsocket.ioのあれらの事
1、WebSocket
WebSocketプロトコルはTCPベースの新しいネットワークプロトコルである.ブラウザとサーバのフルデュプレクス(full-duplex)通信モードを実現し、サーバがクライアントに情報をアクティブに送信するように一般的に解釈することができます.HTML 5仕様における新機能である.
利点:単一のtcp接続上の双方向通信を提供する.
WebSocketは真の意味での双方向通信(ポーリング、ブロッキングアナログ長接続とは異なる)であるため、頻繁な認証などの不要なオーバーヘッドを完全に削減します.WebSocketはHTTP上の拡張と見なすことができ,HTTPの内容を用いたが,HTTPプロトコルとは本質的に異なる.
Websocket接続を実装するには、ブラウザを介してwebsocket接続要求を発行し、サーバが応答する必要があります.このプロセスは通常、「握手」(handshaking)と呼ばれます.WebSocket APIでは、ブラウザとサーバが握手をするだけで、ブラウザとサーバの間に高速チャネルが形成されます.両者の間で直接データを互いに転送することができる.このWebSocketプロトコルでは、インスタント・サービスの実現に2つのメリットがあります.
  • Header

  • コミュニケーションのHeaderは小さいです-たぶん2 Bytesしかありません
  • Server Push

  • サーバのプッシュは,サーバがブラウザのrequestを受動的に受信してからデータを返すのではなく,新しいデータがある場合にアクティブにブラウザにプッシュする.
    ブラウザリクエスト:
    GET /webfin/websocket/ HTTP/1.1
    
    Upgrade: websocket
    
    Connection: Upgrade
    
    Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
    

    サーバの応答:
    HTTP/1.1 101 Switching Protocols
    
    Upgrade: websocket
    
    Connection: Upgrade
    
    Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=
    

    WebSocketはhttpリクエストを借りて握手を行い、通常のhttpリクエストよりもいくつかの内容が増えた.ここで、
    Upgrade: websocket
    
    Connection: Upgrade
    

    httpプロトコルをWebsocketプロトコルにアップグレードしたいことを示します.
    Sec-WebSocket-Keyは、ブラウザがランダムに生成したbase 64 encodeの値で、サーバがWebSocketをサポートしているかどうかを尋ねるために使用されます.
    サーバが戻る
    Upgrade: websocket
    
    Connection: Upgrade
    

    ブラウザにアップグレードするのはWebsocketプロトコルだと伝えます
    Sec-WebSocket-Acceptは、要求パッケージ「Sec-WebSocket-Key」の値を、「258 EAFA 5-E 914-47 DA-95 CA-C 5 AB 0 DC 85 B 11」という文字列とつなぎ合わせ、つなぎ合わせた文字列をsha-1演算してbase 64符号化したものである.WebSocketアシスタントサーバであることを説明するために使用されます.
    Sec-WebSocket-Versionは、WebSocketプロトコルのバージョン番号です.RFC 6455が使用するバージョンは13であり、以前の草案のバージョンはすべて廃棄されるべきである.
    ブラウザは、パケットの内容、フォーマット、すなわちwebsocketプロトコル(ステータスコード101)の確立に成功したことを検証する.
    Websocketはブラウザでサポートし、サーバでサポートし、データ転送フォーマットはFrameである必要があります.
    Websocketインスタンスを作成します.
    websocket = new Websocket("ws:localhost/demo");
    2、Socket.io
    Socket.io:
    紹介:Socket.IOはJavaScriptによって完全に実現され、Nodeに基づいている.js、WebSocketをサポートするプロトコルは、クライアントのJavaScriptとサーバ側のNodeを含むリアルタイム通信のためのプラットフォーム間オープンソースフレームワークである.js.
    使用シーン:Socket.IO設計の目標は、リアルタイム分析システム、バイナリストリームデータ処理アプリケーション、オンラインチャットルーム、オンラインカスタマーサービスシステム、コメントシステム、WebIMなど、異なるブラウザとモバイルデバイス上で良好に動作するリアルタイムアプリケーションの構築である.
    特徴:
    1.Socket.IOはすでに多くの強力な機能を持つモジュールと拡張API
    2.Socket.IOはリアルタイム、双方向、イベントベースの通信メカニズムを実現し、リアルタイムの通信問題を解決し、サービス側とクライアントのプログラミング方式を統一した.Socketを起動すると、クライアントとサービス側のパイプが構築され、両方が有無を交換することができます.エクスプレスとjsが提供する従来のリクエスト方式はよく結合されており、同じドメイン名、同じポートに2つの接続方式を提供することができます.
    SOcketをインストールio:
    Socketを構築IO環境ではまずワークスペースとしてのディレクトリを作成し、ノードをインストールする必要がある.js、ワークスペースにSocketをインストールします.IO(コマンド:npm install socket.io)は、環境の構築が完了しました.ノードベースのインストールも可能である.jsフレームワーク(Express.jsなど)は、アプリケーションのサーバ側の開発を支援します.
    npm install socketio express --save-dev
    
    socketio  websocket         ,                 
    
    socket.emit()   
    
    socket.on()   
    

    一般的な方法:
           ,            socket
    
    io.on('connection',function(socket));
    
              
    
    io.sockets.emit('String',data);
    
               
    
    io.sockets.socket(socketid).emit('String', data);
    
              
    
    socket.on('String',function(data));
    
      socket        
    
    socket.emit('String', data);
    

    次に、サービス・エンドのシミュレーション・ログイン・インスタンスを示します(クライアントはsocketio.jsファイルを導入するだけでよいようにします).
    var sio         = require('socket.io')(port);
    var timer       = null;     //    
    var interval    = 1000;     //     ,1s
    
    /**************************************************************
    * SOCKET.IO       
    **************************************************************/
    //   socket.io
    sio.sockets.on('connection', function(socket){
        var address = socket.handshake.address;
        console.log('New client: ' + address);
    
        //               
        startTimer(interval);
    
        //       :auth(uid/token/imei){ret/msg/}
        socket.on('auth', function(data){
    
            console.log('--auth:' + JSON.stringify(data));
            if(data == null) {
               
                return;
            }
            
            if (data.uid == '' || data.token == '' ){
                return;
            }
            
            //       
            if(socket.uid != null){
            
                return;
            }
    
            //         
            //if(!signMgr.checkSign(uid, sign)){
            //  socket_return(socket, 'auth_result', -1, '     ');
            //  socket.disconnect();
            //  return;
            //}
            
            socket.uid      = data.uid;
            socket.token    = data.token;
    
            //     
            pool[socket.uid] = socket;
            
            //     
            show_pool();
            
        });
        
        //        auth(){ret/msg/}
        socket.on('switch', function(data){
            console.log('--switch:' + JSON.stringify(data));
            if(data == null) {
                socket_return(socket, 'switch_result', -1, 'invalid json request', data);
                return;
            }
    
        });
        
        //       
        socket.on('disconnect', function(data){
            console.log('--disconnect:' + JSON.stringify(data));
            //        
            var uid  = socket.uid;
            
            delete pool[uid];
            show_pool();
        });
    });
    console.log("follow server is running. port:" + port);
    
    
    /**************************************************************
    *     ,          
    **************************************************************/
    function startTimer(delay){
        timer = setInterval(broadcast, delay);
    }
    
    function stopTimer(){
        if (timer){
            clearInterval(timer);
            timer = null;
        }
    }
    
    //          
    function show_pool(){
        console.log('--------------pool-------------');
        for(var uid in pool){
            var socket = pool[uid];
    
        }
        console.log('-------------------------------');
    }
    
    /**
     * @brief socket  
     * */
    function socket_return(socket, event, ret, msg, data){
        if (data == undefined){
            data = {};
        }
        socket.emit(event, {ret:ret, msg:msg, data:data});
    }
    
    //     
    function broadcast(){
        for(var uid in pool){
            var socket = pool[uid];
            if (socket == null){
                console.log('pool.socket is empty:' + uid);
                continue;
            }
    
                //      
            socket.emit('gps', {uid:uid,name:name});                        
    }
            
    }