socket.io服务端分析

本文深入探讨了socket.io服务端的实现,从listen函数开始,解释了如何通过http服务器建立socket.io服务,并详细阐述了manager的角色。内容涉及http请求、websocket升级、握手过程以及如何建立websocket连接。socket.io在连接建立后,对socket进行封装,通过transport处理数据帧,解析和编码遵循websocket协议。整个服务端的工作流程清晰地展现在读者面前。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面的一篇文章分析了socket.io的客户端的实现,那么这一篇文章来看看它的服务端是怎么搞的吧。。。

首先我们来看一段用于建立socket.io的服务器的代码吧:

var sio = require('socket.io');  
  
var  wsocket = sio.listen(80);  
  
wsocket.sockets.on('connection', function (socket) {  //当有新的连接建立的时候  
    socket.on("message", function(data){
    	console.log("get : " + data);
    });
    socket.on("disconnect", function(){
    	//console.log("client has closed");
    });
});  

这里可以看到,首先其实是调用listen函数来创建,那么我们来看看这个listen函数究竟是干了什么事情吧:

//其实这里是建立一个http的server,然后让其监听端口,这里的server可以是一个httpserver,也可以是一个端口号
//因为其实websocket本身也是建立在http协议基础上的
exports.listen = function (server, options, fn) {
  if ('function' == typeof server) {
    console.warn('Socket.IO\'s `listen()` method expects an `http.Server` instance\n'
    + 'as its first parameter. Are you migrating from Express 2.x to 3.x?\n'
    + 'If so, check out the "Socket.IO compatibility" section at:\n'
    + 'https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x');
  }

  if ('function' == typeof options) {
    fn = options;
    options = {};
  }

  if ('undefined' == typeof server) {
    server = 80;  //默认端口是80
  }

  if ('number' == typeof server) {
    var port = server;
//如果传进来的参数是一个数字,那么就在这个端口上创建一个httpserver
    if (options && options.key)
      server = require('https').createServer(options);
    else
      server = require('http').createServer();

    //默认的request处理
    server.on('request', function (req, res) {
      res.writeHead(200);
      res.end('Welcome to socket.io.');
    });

    server.listen(port, fn);  //监听端口
  }

  //创建并返回一个manager,其实这个才是最重要的
  return new exports.Manager(server, options);
};

其实这里就可以看到,首先是建立一个http的服务器,这里可能刚开始会觉得比较的奇怪,这是因为websocket的协议本身就用到了http协议的内容,有兴趣的可以去看看websocket额协议的内容就知道了,那么最后再创建一个manager,然后将这个manager,这里也就是说我们其实最终用到的是这个manager来管理socket.io的服务器。。。

那么接下来来看看这个manager是怎么定义的吧:

function Manager (server, options) {
  this.server = server;
  this.namespaces = {};
  this.sockets = this.of('');  //创建一个namespace,而且这个namespace会保存到namespaces中,sockets是默认的namespace
  this.settings = {   //一些默认的参数
      origins: '*:*'
    , log: true
    , store: new MemoryStore
    , logger: new Logger
    , static: new Static(this)
    , heartbeats: true
    , resource: '/socket.io'
    , transports: defaultTransports
    , authorization: false
    , blacklist: ['disconnect']
    , 'log level': 3
    , 'log colors': tty.isatty(process.stdout.fd)
    , 'close timeout': 60
    , 'heartbeat interval': 25
    , 'heartbeat timeout': 60
    , 'polling duration': 20
    , 'flash policy server': t
ESP32是一个嵌入式开发平台,常用于物联网应用,而Socket.io是一种实时全双工通信库,主要用于建立服务器与客户端之间的双向通信。要在ESP32上通过WebSocket协议(Socket.io底层使用)连接到Socket.io服务端,你需要遵循以下步骤: 1. **安装依赖**:首先确保你在ESP32项目中已安装了必要的库,如第三方TCP/UDP socket库,例如`esp_event_socket`,以及支持WebSocket功能的库。 2. **设置TCP连接**:创建一个TCP连接到Socket.io服务器地址,通常是`http(s)://your-server.com:8080/socket.io/?EIO=4&transport=websocket`。这里`EIO`指EventEmitter版本,`4`代表WebSocket协议。 3. **初始化Socket.io**:一旦TCP连接建立,使用Socket.io库实例化一个WebSocket连接,并指定前缀(如果服务器需要的话),然后发送身份验证信息和心跳包来保持连接活跃。 ```cpp #include <WiFi.h> #include <TCPSocket.h> #include <UdpClient.h> #include <TlsClient.h> // 如果需要安全连接 void setup() { WiFi.begin("your_SSID", "your_PASSWORD"); while (WiFi.status() != WL_CONNECTED) delay(1000); // 创建TCP socket TlsClient ws(TLS_SERVER_HOST, TLS_SERVER_PORT); if (!ws.connect()) { Serial.println("Failed to connect to server"); } // 发送身份验证信息或其他初始化数据 ws.print("hello"); // 设置心跳包发送间隔 ws.setPingInterval(60 * 1000); // 每分钟一次 } void loop() { // 接收并处理来自服务器的消息 String message = ws.readStringUntil('\n'); Serial.println(message); // 发送心跳响应 ws.ping(); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值