第一步. 准备

var express = require('express');
var app = express();
var serv = require('http').Server(app);

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

serv.listen(2000);
console.log("Server started.");

var SOCKET_LIST = {};


/* 其他代码 */


var io = require('socket.io')(serv,{});

第二步. 核心

io.sockets.on('connection', function(socket){
    socket.id = Math.random();
    SOCKET_LIST[socket.id] = socket;
    
    socket.on('disconnect',function(){
        delete SOCKET_LIST[socket.id];
    });
    socket.on('sendMsgToServer',function(data){
        var playerName = ("" + socket.id).slice(2,7);
        for(var i in SOCKET_LIST){
            SOCKET_LIST[i].emit('addToChat',playerName + ': ' + data);
        }
    });
});

要点:

  • 第一行是io.sockets不是io.socket
  • 只有第一行的函数有参数socket
  • 维护socket.id,是因为 disconnect 的时候将socket移除需要
  • SOCKET_LIST[socket.id] = socket这样不是很傻吗? 直接 SOCKET_LIST[id] = socket多好?

    • A: 这是为了让socket自己知道自己的id
  • for(var i in SOCKET_LIST) SOCKET_LIST.emit('xxxx', pack)

    • 这段循环代码很关键,一句话形容就是:将pack数据包广播给所有客户端。

第三步. 使用

socket.on('xxxx', function(data) {});

socket.emit('xxxx', data);

无论是服务端,还是客户端,接受和发送信息的部分归根结底就这两句。所有前戏流程都是为这里做准备

'xxxx'是 flag,是信息标记

第四步. 客户端的代码

准备

<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>    
var socket = io();

使用

socket.emit('xxxx', data);

socket.on('xxxx', function(data) {});

注: 定期推送消息的代码

setInterval(function(){
    var pack = {
        player:Player.update(),
        bullet:Bullet.update(),
    }
    
    for(var i in SOCKET_LIST){
        var socket = SOCKET_LIST[i];
        socket.emit('newPositions',pack);
    }
},1000/25);