第一步. 准备
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
- A: 这是为了让
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);
暂无评论