ホームページ  >  記事  >  ウェブフロントエンド  >  HTML5 WebSocket 3 の概要 - 通信モデルのソケット.io_javascript スキル

HTML5 WebSocket 3 の概要 - 通信モデルのソケット.io_javascript スキル

WBOY
WBOYオリジナル
2016-05-16 15:43:482335ブラウズ

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' &#63; '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 で、次の行に注目してください: 73b0576f9b2d9a4f6808f937210380782cacc6d41bbb37262a98f745aa00fbf0。ローカルの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&#63;'));
  socket.on('ready', function () {
   console.log('Connected !');
   socket.emit('msg', confirm('What is your message&#63;'));
  });
 });
</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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。