Estoy escribiendo una aplicación de servidor TCP usando NodeJS. Sin embargo, cada socket se ejecuta en un proceso secundario separado (server.on("conexión")). Para enviar mensajes a clientes específicos, utilicé Emitter, y cada socket genera su propio oyente (en clientID). Entonces, si hay 10000 dispositivos conectados, la aplicación creará 10000 oyentes. Esto se ve terrible. ¿Qué peligros supondrá esto? No puedo encontrar una solución para enviar un mensaje de un cliente a otro en el protocolo TCP escribiendo código NodeJS. Actualización: ¿Tiene alguna idea de enviar un mensaje a un cliente específico sin agregar oyentes personalizados?
Sin embargo, cada socket se ejecuta en un proceso separado.
¿Por qué harías eso? La idea central detrás de NodeJS es ejecutar cosas en un ciclo de eventos. Hilo único, sí, pero asíncrono.
Esto se ve terrible. ¿Qué peligros supondrá esto?
Es terrible. El mayor problema es que sacrificas muchos recursos. No solo genera miles de procesos, sino que también genera muchos emisores. Entonces, en primer lugar, esto significa que se consume mucha RAM. En segundo lugar, esto significa un rendimiento degradado debido al cambio de contexto del proceso, que normalmente es más lento que el cambio de espacio del usuario. Suponiendo que su máquina incluso le permita generar tantos procesos.
No puedo encontrar una solución para enviar un mensaje de un cliente a otro en el protocolo TCP escribiendo código NodeJS.
Supongo que tiene un servidor TCP, dos clientes conectados y el cliente A quiere enviar un mensaje al cliente B. ¿Es correcto? TCP por sí solo no hará eso por ti. Necesitas algún protocolo encima. Por ejemplo:
(username, password) par al servidor. El servidor valida el par. El servidor mantiene una asignación global {"<username>": [sockets]} y agrega un cliente recién autenticado a esa asignación.{"type": "direct", "destination": "clientB", "data": "hello B"} . El servidor analiza el mensaje y lo reenvía al cliente apropiado (tomado del mapeo global). En caso de que desee transmitir el mensaje que envía, diga {"type":"broadcast", "data": "hello all"} tipo de mensaje. Luego, el servidor lo analiza, recorre todos los clientes conectados (que se encuentran en el mapeo global) y reenvía el mensaje a cada cliente.
Por supuesto, también necesita algunos marcos de paquetes. Dado que TCP es un flujo, realmente no comprende los mensajes y dónde comienza uno y termina el otro. Volcar cosas a JSON es la mitad del problema. Porque luego tienes que enviar este JSON a través de la red y el otro lado tiene que saber cuántos bytes tiene que leer. Una forma es prefijar cada mensaje con, digamos, 2 bytes que le dicen al otro lado cuánto dura el mensaje.
Por cierto, es posible que desee considerar usar socket.io (o alguna otra biblioteca) que se encargue de algunos de esos tediosos detalles por usted.