socket.io – cientos de solicitudes en lugar de una conexión

Creé una aplicación simple para comenzar con socket.io, pero cuando la ejecuto, Chrome (probado en otros navegadores, tiene el mismo resultado) se come toda mi CPU y hace muchas solicitudes:

introduzca la descripción de la imagen aquí

Soy nuevo en sockets, pero estoy seguro de que no es así como debería funcionar. El código que se ejecuta en el navegador es realmente simple, solo debe conectarse al socket y registrar todos los datos recibidos en la consola:

index.html

       var Sockets = io.connect('http://localhost:4000'); Sockets.on('Test', function (data) { console.log(data); });    

Además, mi archivo de servidor se ve así:

server.js

 var app = require('express')(); var http = require('http').Server(app); var bodyParser = require("body-parser"); var io = require('socket.io')(http); var port = 4000; http.listen(port, function () { console.log('Server running at port ' + port); }); var urlencodedParser = bodyParser.urlencoded({extended: false}); app.post('/', urlencodedParser, function (req, res) { if (!req.body) return res.sendStatus(400); var post = req.body; io.emit("Test", post.data); console.log(post.data); res.send('true'); }); io.on('connection', function(socket){ console.log('a user connected'); socket.on('disconnect', function(){ console.log('user disconnected'); }); }); 

Cuando node server.js el servidor node server.js , recibí el Server running at port 4000 mensaje del Server running at port 4000 y todo parece estar bien. Pero cuando abro el index.html en mi navegador, la consola del nodo recibe mensajes de correo no deseado de spam. En lugar de conectar un cliente, el navegador realiza docenas de solicitudes cada segundo. Cuando cierro el navegador, no hay salida durante algún tiempo y, a continuación, la consola del nodo recibe spam de user disconnected mensajes user disconnected .

Este servidor debe redirigir todos los datos enviados a través de POST a los sockets conectados. Cuando hago esta solicitud POST, el servidor de nodo lo recibe (lo sé porque lo imprime en la consola de nodo). Pero no es recibido por el cliente de socket, ya que no hay salida en la consola del navegador (pero el navegador aún hace docenas de conexiones nuevas cada segundo).

¿Que esta mal aquí? Primero pensé que me había equivocado, así que volví y copié el código copiado del tutorial que encontré (no en inglés, sino en checo), pero nada cambió. El tutorial tiene muchos comentarios positivos, por lo que es probable que haya algo mal en mi computadora. ¿Pero que?

Entonces, para encontrar qué era exactamente lo que estaba mal, descargué el ejemplo de socket socket desde el sitio web socket.io. Cuando lo ejecuté, experimenté exactamente el mismo comportamiento incorrecto: el navegador abre muchas conexiones de socket cada segundo en lugar de mantener una.

Así que borré la carpeta node_modules y utilicé npm para instalar estos módulos nuevamente y whoa, funcionó. Por lo tanto, es probable que los archivos se corrompan durante la descarga o lo que sea, pero esta vez el mismo procedimiento funcionó nuevamente.

La configuración de ejecutar esa página desde un servidor web diferente al de su servidor socket.io no funcionará como lo tiene usted. Tomará uno de los tres cambios para que funcione:

  1. Puede utilizar el “mismo origen” para la página web y la conexión socket.io cargando la página web desde el mismo servidor que su socket.io. Eso significa que necesita cargar la página web directamente desde su servidor web socket.io.

  2. Puede configurar su servidor web socket.io para aceptar conexiones de origen cruzado (conexiones CORS).

  3. Puede configurar su cliente socket.io para que se conecte directamente mediante webSocket sin realizar la vista previa habitual de socket.io con una solicitud http regular.

Si está probando algo que pretende implementar de verdad, también puede hacer que su servidor web existente socket.io sea su página web y cargar la página web directamente desde allí.


Otra posible causa de una situación como esta es una versión incompatible de cliente y servidor de socket.io. Debe estar absolutamente seguro de que tiene la misma versión de socket.io en el cliente y el servidor. Si obtiene la biblioteca socket.io del cliente desde /socket.io/socket.io.js desde su servidor web socket.io, la versión del cliente siempre coincidirá con la versión del servidor. Como lo está cargando desde un CDN, debe asegurarse manualmente que tiene versiones idénticas.

Había experimentado el mismo problema, siguiendo un ejemplo donde el cliente estaba usando la fuente de socket.io de este cdn: https://cdn.socket.io/socket.io-1.2.0.js

Toneladas de clientes creados cada vez que intentaba ejecutar el archivo (no importa si simplemente hice doble clic en el archivo html, o si lo coloco en un servidor web, como IIS). Entonces me di cuenta de que podría ser una versión anterior, y tomé la última versión de esta fuente: https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.4/socket.io.js

Todo funciona bien ahora. Espero que esto ayude