Socket基于事件工作。有些保留事件可以使用服务器端的Socket对象来访问,以下是这些事件

  • Connect(连接)
  • Message(消息)
  • Disconnect(断开连接)
  • Reconnect(重新连接)
  • Ping
  • Join and(加入)
  • Leave(离开)

客户端Socket对象也为我们提供了一些保留事件,以下是这些事件

  • Connect(连接)
  • Connect_error(连接错误)
  • Connect_timeout(连接超时)
  • Reconnect(重新连接)

在Hello World示例中,我们使用连接和断开事件来记录用户何时连接和断开。现在我们将使用消息事件将消息从服务器传递到客户端。为此,请修改io.on‘connection’, function(socket))调用,以包括以下内容

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

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

io.on('connection', function(socket) {
   console.log('A user connected');

   //Send a message after a timeout of 4seconds
   setTimeout(function() {
      socket.send('Sent a message 4seconds after connection!');
   }, 4000);

   socket.on('disconnect', function () {
      console.log('A user disconnected');
   });
});

http.listen(3000, function() {
   console.log('listening on *:3000');
});

这将在客户端连接后4秒钟向我们的客户端发送一个名为message(built in)的事件。Socket对象上的发送函数将“message”事件关联起来。

现在,我们需要在客户端处理这个事件。因此,编辑您的index.html脚本标签,以包含以下代码

<script>
   var socket = io();
   socket.on('message', function(data){document.write(data)});
</script>

我们现在正在客户端处理“message”事件。当你现在进入浏览器的页面时,你会看到下面的截图。

4秒钟过后,服务器发送消息事件,我们的客户端将处理它并产生以下输出

Note我们在这里发送了一串文本;我们也可以在任何情况下发送一个对象。

message是由API提供的内置事件,但是在实际应用中用处不大,因为我们需要能够区分事件。

为此,Socket.IO为我们提供了创建custom events的能力。您可以使用socket.emit函数创建和触发自定义事件。

例如,下面的代码会发出一个名为testerEvent的事件

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

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

io.on('connection', function(socket) {
   console.log('A user connected');

   //Send a message when
   setTimeout(function() {
      //Sending an object when emmiting an event
      socket.emit('testerEvent', { description: 'A custom event named testerEvent!'});
   }, 4000);

   socket.on('disconnect', function () {
      console.log('A user disconnected');
   });
});

http.listen(3000, function() {
   console.log('listening on localhost:3000');
});

为了在客户机上处理这个自定义事件,我们需要一个监听事件testerEvent的监听器。以下代码在客户端处理此事件

<!DOCTYPE html>
<html>
   <head>
      <title>Hello world</title>
   </head>
   <script src = "/socket.io/socket.io.js"></script>

   <script>
      var socket = io();
      socket.on('testerEvent', function(data){document.write(data.description)});
   </script>
   <body>Hello world</body>
</html>

这将与我们前面的例子一样工作,在这个例子中事件被测试。当您打开浏览器并转到localhost:3000时,您将会看到

Hello world

四秒钟后,将触发该事件,浏览器将文本更改为

A custom event named testerEvent!

我们也可以从客户端发出事件。若要从客户端发出事件,请在Socket对象上使用emit函数。

<!DOCTYPE html>
<html>
   <head>
      <title>Hello world</title>
   </head>
   <script src = "/socket.io/socket.io.js"></script>

   <script>
      var socket = io();
      socket.emit('clientEvent', 'Sent an event from the client!');
   </script>
   <body>Hello world</body>
</html>

要处理这些事件,请在服务器上的Socket对象上使用on function

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

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

io.on('connection', function(socket) {
   socket.on('clientEvent', function(data) {
      console.log(data);
   });
});

http.listen(3000, function() {
   console.log('listening on localhost:3000');
});

所以,现在如果我们去localhost:3000,我们将会触发一个名为clientEvent的自定义事件。此事件将通过日志记录在服务器上处理

Sent an event from the client!