爱凉拌菜真是太好了

socket.io 的使用

首先配置好服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
...
... //前面省略
...
var server = app.listen(app.get('port'), function() {
console.log('node 正在运行,端口:'+app.get('port'));
});
var io = require('socket.io')(server, {
pingTimeout: 5000,
pingInterval: 10000
})
io.on('connection', function(socket) {
console.log(socket.id)
socket.on('disconnect', () => {
for(var i in oSocketIDs) {
if(oSocketIDs[i] === socket.id) {
delete(oSocketIDs[i]);
}
}
delete(oSockets[socket.id])
})
socket.on('chat message',(msg, fn) => {
io.emit('chat message', msg);
fn('success')
})
})

然后客户端需要配置socket

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<body>
<ul id="messages"></ul>
<form action="">
<input id="m" autocomplete="off" /><button>Send</button>
</form>
<script src="/socket.io/socket.io.js"></script>
<script src="https://code.jquery.com/jquery-1.11.1.js"></script>
<!-- 如果socket.io.js 和服务器不在一个域下面,则需要指定详细地址 -->
<!-- <script src='http://localhost:8888/socket.io/socket.io.js'></script> -->
<script>
var socket = io();
// 如果socket.io.js 和服务器不在一个域下面,则需要指定详细地址
// var socket = io('http://localhost:8888')
$('form').submit(function(event) {
event.preventDefault();
socket.emit('chat message', $('#m').val());
return false;
});
socket.on('chat message', function(msg) {
$('#messages').append($('<li>').text(msg));
})
$.ajax({
url: '/test',
type: 'get',
data: {param1: 'value1'}
})
.done(function() {
console.log("success");
})
.fail(function() {
console.log("error");
})
.always(function() {
console.log("complete");
});
</script>
</body>
  • 客户端手动断开socket, 使用socket.close(); 手动重连socket.open();
  • socket监听事件,使用socket.on();
  • 服务端广播消息,io.emit:广播全部包括自己, socket.broadcast.emit: 广播全部不包括自己

socket.io 实现点对点发送消息

实现方式:在io.on(‘connection’)的时候,所有的socket按照某种关键字保存起来, 比如一个对象oSockets。做{username: socket} 的对应关系。然后在服务器端监听到某个私有消息事件的时候,根据客户端指定的username,选择oSockets[username].emit(…)就行了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// 完整代码
// 服务端
var oSocketIDs = {};
var oSockets = {};
io.on('connection', function(socket) {
socket.on('create user', (username) => {
console.log(username)
oSockets[username] = socket;
oSocketIDs[username] = socket.id;
socket.emit('find user', oSocketIDs);
})
console.log(socket.id)
socket.on('disconnect', () => {
// 断开的时候删除oSocket的相应内容
for(var i in oSocketIDs) {
if(oSocketIDs[i] === socket.id) {
delete(oSocketIDs[i]);
delete(oSockets[i])
}
}
})
socket.on('private message', (from, to, data, fn) => {
oSockets[to].emit('private msg', data) // to 就代表要发送的某个用户
})
socket.on('private filedata', (from, to ,data, fn) => {
if(!to) {
fn('error');
return;
}
oSockets[to].emit('receive private file', data)
fn('success')
})
})
// 客户端
window.socket.emit('private message', from , to, data,(ack) => {
ack === 'success' && message.success('私信成功');
});