socket.io官方文檔翻譯2

原文地址(https://socket.io/docs/

概述

如何使用

安裝

$ npm install socket.io

在node http服務(wù)器上使用

server(app.js)

var app = require('http').createServer(handler)
var io = require('socket.io')(app);
var fs = require('fs');

app.listen(80);

function handler (req, res) {
  fs.readFile(__dirname + '/index.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }

    res.writeHead(200);
    res.end(data);
  });
}

io.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

client(index.html)

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io('http://localhost');
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>

在express3/4上使用

server(app.js)

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);

server.listen(80);

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

io.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

client(html)

<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>

在express2.x上使用

server(app.js)

var app = require('express').createServer();
var io = require('socket.io')(app);

app.listen(80);

app.get('/', function (req, res) {
  res.sendFile(__dirname + '/index.html');
});

io.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

發(fā)送和接收事件

Socket.IO允許您發(fā)送和接收自定義事件。除了connect,message和disconnect,您都可以發(fā)出其他自定義事件:

server

// note, io(<port>) will create a http server for you
// 注意,io(<port>)這種寫法會為你創(chuàng)建一個http服務(wù)
var io = require('socket.io')(80);

io.on('connection', function (socket) {
  io.emit('this', { will: 'be received by everyone'});

  socket.on('private message', function (from, msg) {
    console.log('I received a private message by ', from, ' saying ', msg);
  });

  socket.on('disconnect', function () {
    io.emit('user disconnected');
  });
});

限定自己的命名空間

如果您可以控制特定應(yīng)用程序發(fā)出的所有消息和事件,則使用默認/命名空間即可。如果你想利用第三方代碼,或者把自己的代碼與他人共享,socket.io提供了一種命名空間方法。

這樣做的好處是multiplexing(復用)單個連接。而不是使用兩個WebSocket連接的socket.io,它只使用一個。

server(app.js)

var io = require('socket.io')(80);
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(index.html)

<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>

發(fā)送可失效消息

有時某些消息可能會丟失?,F(xiàn)在我們假設(shè)您要做一款顯示關(guān)鍵字“bieber”的實時推送應(yīng)用程序。

如果某個客戶端沒有準備好接收消息(由于網(wǎng)絡(luò)緩慢或其他問題,或者因為它們通過長輪詢連接并處于請求 - 響應(yīng)周期的中間),所以如果它沒有收到所有與bieber相關(guān)的消息,應(yīng)用程序可以不受影響。

在這種情況下,您可能希望將這些消息作為可失效性消息發(fā)送。

server

var io = require('socket.io')(80);

io.on('connection', function (socket) {
  var tweets = setInterval(function () {
    getBieberTweet(function (tweet) {
      socket.volatile.emit('bieber tweet', tweet);
    });
  }, 100);

  socket.on('disconnect', function () {
    clearInterval(tweets);
  });
});

發(fā)送和接收數(shù)據(jù)(確認)

有時,您可能想得到在客戶端收到信息后發(fā)出的一個反饋。

要做到這一點,只需傳遞一個函數(shù)作為.send或.emit的最后一個參數(shù)即可。更重要的是,當您使用.emit時,確認由您完成,這意味著您也可以傳遞數(shù)據(jù):

server(app.js)

var io = require('socket.io')(80);

io.on('connection', function (socket) {
  socket.on('ferret', function (name, fn) {
    fn('woot');
  });
});

client(index.html)

<script>
  var socket = io(); // TIP: io() with no args does auto-discovery
  socket.on('connect', function () { // TIP: you can avoid listening on `connect` and listen on events directly too!
    socket.emit('ferret', 'tobi', function (data) {
      console.log(data); // data will be 'woot'
    });
  });
</script>

廣播消息

要進行廣播,只需添加一個廣播標志來調(diào)用emit和send方法即可。廣播意味著將消息發(fā)送給除啟動socket以外的其他人。

server

var io = require('socket.io')(80);

io.on('connection', function (socket) {
  socket.broadcast.emit('user connected');
});

將其用作跨瀏覽器的WebSocket

server(app.js)

var io = require('socket.io')(80);

io.on('connection', function (socket) {
  socket.on('message', function () { });
  socket.on('disconnect', function () { });
});

client(index.html)

<script>
  var socket = io('http://localhost/');
  socket.on('connect', function () {
    socket.send('hi');

    socket.on('message', function (msg) {
      // my msg
    });
  });
</script>

如果您不關(guān)心重新連接邏輯等,請查看Engine.IO,它是Socket.IO使用的WebSocket語義傳輸層。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容