¿No tengo que especificar un puerto para heroku para mi aplicación socket.io?

Hice con éxito una aplicación de chat de prueba y obtuve un servidor js de nodo con socket.io ejecutándose en heroku. En mi computadora local tengo que especificar el número de puerto de localhost en el lado del cliente al puerto que el servidor ha configurado. Sin embargo, cuando ejecuto mi código de servidor en heroku. Quitando el servidor

Estoy usando la variable process.env.PORT ya que heroku configura eso:

var port = process.env.PORT || 3000; http.listen(port, function(){ console.log('listening on *:' + port); }); 

Naturalmente, encuentro el número de puerto que la aplicación está ejecutando en su lugar en la url

 var socket = io('https://xxxx.herokuapp.com:1111'); 

Sin embargo, esto me da una “net :: ERR_CONNECTION_REFUSED”.

Lo hice funcionar eliminando el puerto nubmer después de la url (en este ejemplo: 1111). Me pregunto por qué esto funciona, ya que la mayoría de los tutoriales y artículos en línea tienen que especificar el puerto y por qué mi computadora local también necesita el puerto para funcionar.

Cuando se conecta a su subdominio https://xxxx.herokuapp.com en heroku en el puerto 443 (que es el puerto que se usa para una conexión https cuando no se especifica ningún puerto), es probable que Heroku esté usando un proxy o enrutador para enrutarlo. conexión entrante al puerto particular que su servidor node.js está escuchando. En la infraestructura de Heroku, ellos saben en qué host interno real se está ejecutando su servidor y en qué número de puerto se está ejecutando para poder asignar una solicitud de puerto predeterminada en su subdominio al puerto / host real.

Esto se hace para que los navegadores puedan conectarse a su subdominio directamente en el puerto predeterminado sin tener que conocer los detalles de la instalación del servidor de nodo y para que Heroku pueda administrar automáticamente su servidor y probablemente compartir el hardware con otros clientes. Cada uno está ejecutando en un puerto diferente, pero compartiendo la misma máquina. Heroku gestiona los puertos en su totalidad y esta es una forma en la que pueden colocar a varios clientes en el mismo hardware sin que cada uno tenga que especificar un puerto personalizado en la URL del navegador (lo que sería un no iniciador para la mayoría de los clientes).

Entonces, Heroku está alojando algún tipo de proxy para su subdominio que escucha el puerto https predeterminado. Por lo tanto, no es necesario especificar el puerto en la URL. Internamente, enrutan esa conexión a su puerto real en su servidor real.

Cuando se ejecuta en su escritorio, no hay tal proxy para hacer esto por usted, por lo que debe asegurarse de que los números de puerto del cliente y del servidor coincidan.