Inicialización del servidor
Una vez que hayas instalado la biblioteca del servidor Socket.IO, ahora puedes inicializar el servidor. La lista completa de opciones se puede encontrar aquí.
Para usuarios de TypeScript, es posible proporcionar sugerencias de tipo para los eventos. Por favor revisa esto.
Inicialización
Independiente
- CommonJS
- ES modules
- TypeScript
const { Server } = require("socket.io");
const io = new Server({ /* opciones */ });
io.on("connection", (socket) => {
// ...
});
io.listen(3000);
import { Server } from "socket.io";
const io = new Server({ /* opciones */ });
io.on("connection", (socket) => {
// ...
});
io.listen(3000);
import { Server } from "socket.io";
const io = new Server({ /* opciones */ });
io.on("connection", (socket) => {
// ...
});
io.listen(3000);
También puedes pasar el puerto como primer argumento:
- CommonJS
- ES modules
- TypeScript
const { Server } = require("socket.io");
const io = new Server(3000, { /* opciones */ });
io.on("connection", (socket) => {
// ...
});
import { Server } from "socket.io";
const io = new Server(3000, { /* opciones */ });
io.on("connection", (socket) => {
// ...
});
import { Server } from "socket.io";
const io = new Server(3000, { /* opciones */ });
io.on("connection", (socket) => {
// ...
});
Esto inicia implícitamente un servidor HTTP de Node.js, al cual se puede acceder a través de io.httpServer.
Con un servidor HTTP
- CommonJS
- ES modules
- TypeScript
const { createServer } = require("http");
const { Server } = require("socket.io");
const httpServer = createServer();
const io = new Server(httpServer, { /* opciones */ });
io.on("connection", (socket) => {
// ...
});
httpServer.listen(3000);
import { createServer } from "http";
import { Server } from "socket.io";
const httpServer = createServer();
const io = new Server(httpServer, { /* opciones */ });
io.on("connection", (socket) => {
// ...
});
httpServer.listen(3000);
import { createServer } from "http";
import { Server } from "socket.io";
const httpServer = createServer();
const io = new Server(httpServer, { /* opciones */ });
io.on("connection", (socket) => {
// ...
});
httpServer.listen(3000);
Con un servidor HTTPS
- CommonJS
- ES modules
- TypeScript
const { readFileSync } = require("fs");
const { createServer } = require("https");
const { Server } = require("socket.io");
const httpsServer = createServer({
key: readFileSync("/path/to/my/key.pem"),
cert: readFileSync("/path/to/my/cert.pem")
});
const io = new Server(httpsServer, { /* opciones */ });
io.on("connection", (socket) => {
// ...
});
httpsServer.listen(3000);
import { readFileSync } from "fs";
import { createServer } from "https";
import { Server } from "socket.io";
const httpsServer = createServer({
key: readFileSync("/path/to/my/key.pem"),
cert: readFileSync("/path/to/my/cert.pem")
});
const io = new Server(httpsServer, { /* opciones */ });
io.on("connection", (socket) => {
// ...
});
httpsServer.listen(3000);
import { readFileSync } from "fs";
import { createServer } from "https";
import { Server } from "socket.io";
const httpsServer = createServer({
key: readFileSync("/path/to/my/key.pem"),
cert: readFileSync("/path/to/my/cert.pem")
});
const io = new Server(httpsServer, { /* opciones */ });
io.on("connection", (socket) => {
// ...
});
httpsServer.listen(3000);
Ver también: documentación de Node.js
Con autenticación de certificado de cliente:
Servidor
import { readFileSync } from "fs";
import { createServer } from "https";
import { Server } from "socket.io";
const httpsServer = createServer({
key: readFileSync("/path/to/server-key.pem"),
cert: readFileSync("/path/to/server-cert.pem"),
requestCert: true,
ca: [
readFileSync("/path/to/client-cert.pem")
]
});
const io = new Server(httpsServer, { /* opciones */ });
io.engine.on("connection", (rawSocket) => {
// si necesitas los detalles del certificado (ya no está disponible una vez completado el handshake)
rawSocket.peerCertificate = rawSocket.request.client.getPeerCertificate();
});
io.on("connection", (socket) => {
console.log(socket.conn.peerCertificate);
// ...
});
httpsServer.listen(3000);
Cliente
import { readFileSync } from "fs";
import { io } from "socket.io-client";
const socket = io("https://example.com", {
key: readFileSync("/path/to/client-key.pem"),
cert: readFileSync("/path/to/client-cert.pem"),
ca: [
readFileSync("/path/to/server-cert.pem")
]
});
Con un servidor HTTP/2
- CommonJS
- ES modules
- TypeScript
const { readFileSync } = require("fs");
const { createSecureServer } = require("http2");
const { Server } = require("socket.io");
const httpServer = createSecureServer({
allowHTTP1: true,
key: readFileSync("/path/to/my/key.pem"),
cert: readFileSync("/path/to/my/cert.pem")
});
const io = new Server(httpServer, { /* opciones */ });
io.on("connection", (socket) => {
// ...
});
httpServer.listen(3000);
import { readFileSync } from "fs";
import { createSecureServer } from "http2";
import { Server } from "socket.io";
const httpServer = createSecureServer({
allowHTTP1: true,
key: readFileSync("/path/to/my/key.pem"),
cert: readFileSync("/path/to/my/cert.pem")
});
const io = new Server(httpServer, { /* opciones */ });
io.on("connection", (socket) => {
// ...
});
httpServer.listen(3000);
import { readFileSync } from "fs";
import { createSecureServer } from "http2";
import { Server } from "socket.io";
const httpServer = createSecureServer({
allowHTTP1: true,
key: readFileSync("/path/to/my/key.pem"),
cert: readFileSync("/path/to/my/cert.pem")
});
const io = new Server(httpServer, { /* opciones */ });
io.on("connection", (socket) => {
// ...
});
httpServer.listen(3000);
Ver también: documentación de Node.js
Con Express
- CommonJS
- ES modules
- TypeScript
const express = require("express");
const { createServer } = require("http");
const { Server } = require("socket.io");
const app = express();
const httpServer = createServer(app);
const io = new Server(httpServer, { /* opciones */ });
io.on("connection", (socket) => {
// ...
});
httpServer.listen(3000);
import express from "express";
import { createServer } from "http";
import { Server } from "socket.io";
const app = express();
const httpServer = createServer(app);
const io = new Server(httpServer, { /* opciones */ });
io.on("connection", (socket) => {
// ...
});
httpServer.listen(3000);
import * as express from "express";
import { createServer } from "http";
import { Server } from "socket.io";
const app = express();
const httpServer = createServer(app);
const io = new Server(httpServer, { /* opciones */ });
io.on("connection", (socket) => {
// ...
});
httpServer.listen(3000);
Usar app.listen(3000) no funcionará aquí, ya que crea un nuevo servidor HTTP.
Más información aquí.
Con Koa
- CommonJS
- ES modules
- TypeScript
const Koa = require("koa");
const { createServer } = require("http");
const { Server } = require("socket.io");
const app = new Koa();
const httpServer = createServer(app.callback());
const io = new Server(httpServer, { /* opciones */ });
io.on("connection", (socket) => {
// ...
});
httpServer.listen(3000);
import Koa from "koa";
import { createServer } from "http";
import { Server } from "socket.io";
const app = new Koa();
const httpServer = createServer(app.callback());
const io = new Server(httpServer, { /* opciones */ });
io.on("connection", (socket) => {
// ...
});
httpServer.listen(3000);
import * as Koa from "koa";
import { createServer } from "http";
import { Server } from "socket.io";
const app = new Koa();
const httpServer = createServer(app.callback());
const io = new Server(httpServer, { /* opciones */ });
io.on("connection", (socket) => {
// ...
});
httpServer.listen(3000);
Más información aquí.
Con Nest
Ver la documentación aquí.
NestJS v7 y anteriores dependen de Socket.IO v2, mientras que NestJS v8 depende de Socket.IO v4. Por favor usa un cliente compatible.
Con Fastify
Necesitas registrar el plugin fastify-socket.io:
- CommonJS
- ES modules
- TypeScript
const fastify = require("fastify");
const fastifyIO = require("fastify-socket.io");
const server = fastify();
server.register(fastifyIO);
server.get("/", (req, reply) => {
server.io.emit("hello");
});
server.ready().then(() => {
// necesitamos esperar a que el servidor esté listo, de lo contrario `server.io` es undefined
server.io.on("connection", (socket) => {
// ...
});
});
server.listen({ port: 3000 });
import fastify from "fastify";
import fastifyIO from "fastify-socket.io";
const server = fastify();
server.register(fastifyIO);
server.get("/", (req, reply) => {
server.io.emit("hello");
});
server.ready().then(() => {
// necesitamos esperar a que el servidor esté listo, de lo contrario `server.io` es undefined
server.io.on("connection", (socket) => {
// ...
});
});
server.listen({ port: 3000 });
import fastify from "fastify";
import fastifyIO from "fastify-socket.io";
const server = fastify();
server.register(fastifyIO);
server.get("/", (req, reply) => {
server.io.emit("hello");
});
server.ready().then(() => {
// necesitamos esperar a que el servidor esté listo, de lo contrario `server.io` es undefined
server.io.on("connection", (socket) => {
// ...
});
});
server.listen({ port: 3000 });
Con µWebSockets.js
import { App } from "uWebSockets.js";
import { Server } from "socket.io";
const app = App();
const io = new Server();
io.attachApp(app);
io.on("connection", (socket) => {
// ...
});
app.listen(3000, (token) => {
if (!token) {
console.warn("puerto ya en uso");
}
});
Referencia: https://github.com/uNetworking/uWebSockets.js
Con Hono (Node.js)
- CommonJS
- ES modules
- TypeScript
const { Hono } = require("hono");
const { serve } = require("@hono/node-server");
const { Server } = require("socket.io");
const app = new Hono();
const httpServer = serve({
fetch: app.fetch,
port: 3000,
});
const io = new Server(httpServer, {
/* opciones */
});
io.on("connection", (socket) => {
// ...
});
import { Hono } from "hono";
import { serve } from "@hono/node-server";
import { Server } from "socket.io";
const app = new Hono();
const httpServer = serve({
fetch: app.fetch,
port: 3000,
});
const io = new Server(httpServer, {
/* opciones */
});
io.on("connection", (socket) => {
// ...
});
import { Hono } from "hono";
import { serve } from "@hono/node-server";
import { Server } from "socket.io";
import type { Server as HTTPServer } from "node:http";
const app = new Hono();
const httpServer = serve({
fetch: app.fetch,
port: 3000,
});
const io = new Server(httpServer as HTTPServer, {
/* opciones */
});
io.on("connection", (socket) => {
// ...
});
Referencia: https://hono.dev/docs/
Con Hono & Bun
import { Server as Engine } from "@socket.io/bun-engine";
import { Server } from "socket.io";
import { Hono } from "hono";
const io = new Server();
const engine = new Engine();
io.bind(engine);
io.on("connection", (socket) => {
// ...
});
const app = new Hono();
const { websocket } = engine.handler();
export default {
port: 3000,
idleTimeout: 30, // debe ser mayor que la opción "pingInterval" del motor, que por defecto es 25 segundos
fetch(req, server) {
const url = new URL(req.url);
if (url.pathname === "/socket.io/") {
return engine.handleRequest(req, server);
} else {
return app.fetch(req, server);
}
},
websocket
}
Referencia: https://hono.dev/docs/
Opciones
La lista completa de opciones disponibles se puede encontrar aquí.