首先配置好服务器

...
... //前面省略
...
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

<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(…)就行了

// 完整代码
// 服务端
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('私信成功');
});