socket.io はなぜ生まれたのですか?以下のテキスト説明を参照してください。
socket.io が必要な理由は何ですか?
Node.js はサーバー側で効率的な動作環境を提供しますが、ブラウザ側での HTML5 のサポートが異なるため、すべてのブラウザと互換性があり、優れたリアルタイム ユーザー エクスペリエンスを提供し、クライアントとプログラマー向けのサービス 一貫したプログラミング エクスペリエンスを提供するために、socket.io が誕生しました。
socket.io の設計目標は、あらゆるブラウザーとあらゆるモバイル デバイスをサポートすることです。現在、主流の PC ブラウザ (IE、Safari、Chrome、Firefox、Opera など) とモバイル ブラウザ (iphone Safari/ipad Safari/android WebKit/WebOS WebKit など) をサポートしています。
Socket.io は、node.js をベースにしており、WebSocket API を簡素化し、さまざまな通信 API を統合します。 WebSocket、Flash Socket、AJAX ロングポーリング、AJAX マルチパート ストリーミング、Forever IFrame、JSONP ポーリングをサポートします。
Socket.io は、リアルタイム通信の問題を解決し、サーバーとクライアントのプログラミング方法を統合します。ソケットを開始すると、クライアントとサーバーの間にパイプラインが確立され、双方が相互に通信できるようになります。
インストール
コマンドラインで npm installソケット.io を実行してインストールします。
サーバーサイドプログラミングモデル
サーバー側のプログラミングは通常のサーバーと同じで、サーバーの起動、サービスの提供、イベントの処理が行われます。
たとえば、次のserver.js:
var http = require('http') , url = require('url') , fs = require('fs') , server; server = http.createServer(function(req, res){ // your normal server code var path = url.parse(req.url).pathname; switch (path){ case '/': res.writeHead(200, {'Content-Type': 'text/html'}); res.write('<h1>Hello! Try the <a href="/index.html">Socket.io Test</a></h1>'); res.end(); break; case '/index.html': fs.readFile(__dirname + path, function(err, data){ if (err) return send404(res); res.writeHead(200, {'Content-Type': path == 'json.js' ? 'text/javascript' : 'text/html'}) res.write(data, 'utf8'); res.end(); }); break; default: send404(res); } }), send404 = function(res){ res.writeHead(404); res.write('404'); res.end(); }; server.listen(8080); var io = require('socket.io').listen(server); io.sockets.on('connection', function(socket){ console.log("Connection " + socket.id + " accepted."); socket.on('message', function(message){ console.log("Received message: " + message + " - from client " + socket.id); }); socket.on('disconnect', function(){ console.log("Connection " + socket.id + " terminated."); }); });
クライアント プログラミング モデル
クライアント プログラミングも同様の方法で処理され、サーバーに接続して情報を交換します。
たとえば、次のindex.htmlページ:
<!doctype html> <html> <head> <title>Socket.io Test</title> <script src="/json.js"></script> <!-- for ie --> <script src="/socket.io/socket.io.js"></script> </head> <body> <script> var socket; var firstconnect = true; function connect() { if(firstconnect) { socket = io.connect(null); socket.on('message', function(data){ message(data); }); socket.on('connect', function(){ status_update("Connected to Server"); }); socket.on('disconnect', function(){ status_update("Disconnected from Server"); }); socket.on('reconnect', function(){ status_update("Reconnected to Server"); }); socket.on('reconnecting', function( nextRetry ){ status_update("Reconnecting in " + nextRetry + " seconds"); }); socket.on('reconnect_failed', function(){ message("Reconnect Failed"); }); firstconnect = false; } else { socket.socket.reconnect(); } } function disconnect() { socket.disconnect(); } function message(data) { document.getElementById('message').innerHTML = "Server says: " + data; } function status_update(txt){ document.getElementById('status').innerHTML = txt; } function esc(msg){ return msg.replace(/</g, '<').replace(/>/g, '>'); } function send() { socket.send("Hello Server!"); }; </script> <h1>Socket.io Test</h1> <div><p id="status">Waiting for input</p></div> <div><p id="message"></p></div> <button id="connect" onClick='connect()'/>Connect</button> <button id="disconnect" onClick='disconnect()'>Disconnect</button> <button id="send" onClick='send()'/>Send Message</button> </body> </html>
メモ
1. サーバーを起動するには、node のままにしてコマンド ライン ウィンドウを開き、server.js が存在するフォルダーに移動し、「node server.js」と入力してサーバーを起動します。
上記のindex.html で、次の行に注目してください: 。ローカルのsocket.ioスクリプトを使用したくない場合は、
を実行できます。次のパブリック スクリプトを直接使用するには:
<script src="http://cdn.socket.io/stable/socket.io.js"></script>
次の行にも注意してください: socket = io.connect(null)。
ここでの null はローカル サービスへの接続を表しており、これを「localhost」に置き換えても効果は同じになります。
2.socket.io を使用して http サービスを直接開始できます。
例:
var io = require('socket.io').listen(80); io.sockets.on('connection', function (socket) { io.sockets.emit('this', { will: 'be received by everyone'}); });
3. Socket.io は、send メソッドを通じてメッセージを直接送信し、メッセージ イベントを使用してメッセージを受信できます。例:
//server.js var io = require('socket.io').listen(80); io.sockets.on('connection', function (socket) { socket.on('message', function () { }); }); //index.html <script> var socket = io.connect('http://localhost/'); socket.on('connect', function () { socket.send('hi'); socket.on('message', function (msg) { // my msg }); }); </script>
4. データの送信と処理
両端は相互にイベントを送信し、相互にデータを送信し、相互に通信できます。イベントを送信するコードは次のとおりです。socket.emit(action, data, function)。ここで、action はイベントの名前、data はデータ、function はイベントを処理するコードです。 on(action, function), if Emit sends データがある場合、関数のパラメータにはこのデータが含まれます。組み込みイベント、socket.io の送信と処理に加えて、接続、切断、メッセージなど。また、次のようなカスタム イベントの送信と処理も可能になります。
//サーバー:
io.sockets.on('connection', function (socket) { socket.emit('news', { hello: 'world' }); socket.on('my other event', function (data) { console.log(data); }); });
//クライアント:
<script src="/socket.io/socket.io.js"></script> <script> var socket = io.connect('http://localhost'); socket.on('news', function (data) { console.log(data); socket.emit('my other event', { my: 'data' }); }); </script>
5. 上記からわかるように、データを送信する場合は、send と Emit の両方を使用できます。これは、Emit がカスタム イベントの処理を強化するだけです。
6. サーバー側でソケットの get/set メソッドを使用して、関連データをクライアント側に保存できます。例:
//サーバー
var io = require('socket.io').listen(80); io.sockets.on('connection', function (socket) { socket.on('set nickname', function (name) { socket.set('nickname', name, function () { socket.emit('ready'); }); }); socket.on('msg', function () { socket.get('nickname', function (err, name) { console.log('Chat message by ', name); }); }); });
//クライアント
<script> var socket = io.connect('http://localhost'); socket.on('connect', function () { socket.emit('set nickname', confirm('What is your nickname?')); socket.on('ready', function () { console.log('Connected !'); socket.emit('msg', confirm('What is your message?')); }); }); </script>
7. 現在のソケット接続を除くチャット ルーム内の全員にメッセージを送信するなど、メッセージをブロードキャストできます。
var io = require('socket.io').listen(80); io.sockets.on('connection', function (socket) { socket.broadcast.emit('user connected'); });
8. 複数のリンクを確立する代わりに、同じリンク内に複数の独立したチャネルを確立できます。この正式な名前は「複数の名前空間」です。たとえば、公式の例:
var io = require('socket.io').listen(80); //Server var chat = io .of('/chat') .on('connection', function (socket) { socket.emit('a message', { that: 'only' , '/chat': 'will get' }); chat.emit('a message', { everyone: 'in' , '/chat': 'will get' }); }); var news = io .of('/news') .on('connection', function (socket) { socket.emit('item', { news: 'item' }); }); //Client <script> var chat = io.connect('http://localhost/chat') , news = io.connect('http://localhost/news'); chat.on('connect', function () { chat.emit('hi!'); }); news.on('news', function () { news.emit('woot'); }); </script>
socket.io 構成
socket.io の設定は非常に簡単です。express を設定した場合は、ほぼ同じ方法を使用していることがわかります。まず小さな例を見てみましょう:
var io = require('socket.io').listen(80); io.configure('production', function(){ io.enable('browser client etag'); io.set('log level', 1); io.set('transports', [ 'websocket' , 'flashsocket' , 'htmlfile' , 'xhr-polling' , 'jsonp-polling' ]); }); io.configure('development', function(){ io.set('transports', ['websocket']); });
ご覧のとおり、socket.io は設定にconfigure、set、enable、disableを使用します。
1.configure メソッドを使用して、さまざまなオペレーティング環境での動作を構成します。つまり、さまざまな環境でさまざまな構成オプションを有効にします。 configure の最初のパラメータは実行環境、2 番目のパラメータは設定用の関数です。通常、実行環境は実稼働環境または開発環境です。もちろん、ここでは任意の文字列を使用できます。 configure の最初のパラメータが省略された場合、後続の設定はパブリックであり、環境に関係なく有効であることを意味します。
2. さまざまな動作環境を設定した後、現在どの環境で実行されているかをどのように設定しますか?これは、コマンド ラインで環境変数 NODE_ENV の値を変更することによって実現されます。
3.configure 構成関数では、set、enable、disable を使用して関連オプションを設定できます。
4. 特定の構成可能な項目のリファレンス: https://github.com/LearnBoost/Socket.IO/wiki/Cconfiguring-Socket.IO
実用的なリファレンス
Socket.io の概要: http://davidchambersdesign.com/getting-started-with-socket.io/
socket.io のインストールと使用手順: http://socket.io/
socket.io Wiki: https://github.com/LearnBoost/Socket.IO/wiki