Le serveur de discussion par socket TCP simple ne fonctionne pas sur heroku

Je voulais créer un serveur de chat node.js sur heroku. Les clients de chat seront des applications iOS.

Ma première tentative est de construire un serveur basé sur socket.io. Cela fonctionne, mais je n’aime pas le fait que l’application iOS communique avec le serveur en utilisant une longue interrogation au lieu de WebSocket ou TCP.

Donc, ma deuxième tentative consiste à construire le serveur en utilisant un socket TCP réel, avec le code ci-dessous:

var net = require('net'); var sockets = []; var server = net.createServer(function(socket){ sockets.push(socket); socket.on('data', function (data) { for(var i=0; i< sockets.length; i++) { sockets[i].write(data); } }); socket.on('end', function() { var i = sockets.indexOf(socket); sockets.splice(i, 1); }) }); var port = process.env.PORT || 5000; console.log("server listening to port " + port); server.listen(port); 

Si je déploie ce code de serveur node.js dans localhost, je peux envoyer et recevoir des conversations avec le serveur TCP avec le terminal en tant que client test

 nc localhost 5000 

MAIS, si je déploie ce code de serveur dans heroku, je ne pourrais plus établir de connexion TCP avec le serveur.

Je crois comprendre que le serveur écoutera le processus.env.PORT.

J’ai donc d’abord tracé le port que le serveur écoute, par exemple 30134.

Alors si j’essaye de me connecter de cette façon:

 nc http://my-heroku-app.herokuapp.com 30134 

Rien ne se passe.

Je pense avoir quelque malentendu fondamental quelque part. Quelqu’un peut-il me guider? Est-ce que le chat sur socket Real TCP est possible sur le serveur heroku?

Heroku ne supporte pas websocket. C’est pourquoi, par exemple, socket.io doit être obligé d’utiliser xhr-polling . (voir https://devcenter.heroku.com/articles/using-socket-io-with-node-js-on-heroku ).

Au lieu d’utiliser directement les sockets, vous pouvez utiliser quelque chose comme socket.io qui prend en charge plusieurs transports.

En effet, ils utilisent une ancienne version de nginx , qui ne disposait pas d’une prise en charge complète du socket Web.

De plus, le port écouté par votre application, eg 30134 est eg 30134 par nginx à partir de votre nom d’hôte heroku sur le port 80 vers votre port d’application sur le réseau interne de heroku.

Je sais que je suis très en retard pour cette soirée mais j’ai écrit un addon pour acheminer des sockets TCP bruts vers Heroku ( https://addons.heroku.com/ruppells-sockets ) afin de soutenir un projet sur lequel je travaillais. C’est très bêta alors soyez gentil.

Si vous avez toujours besoin de cette fonctionnalité, je souhaiterais avoir votre avis. La documentation de l’addon renvoie à un exemple de serveur nodejs TCP et Websocket pour l’inspiration.