2013-03-06 40 views
1

我想在heroku上建立一個node.js聊天服務器,聊天客戶端就是iOS應用程序。簡單的TCP套接字聊天服務器不能在heroku上工作

我的第一個嘗試是建立一個基於socket.io的服務器。它的工作原理,但我不喜歡的事實,iOS應用程序正在使用長輪詢而不是websocket或tcp套接字與服務器通話。

所以我的第二次嘗試是使用真實的TCP套接字,代碼如下構建服務器:

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); 

如果我部署此Node.js的本地主機中的服務器代碼,我可以成功地發送和接收聊天到使用終端作爲測試客戶端

nc localhost 5000 

,但如果我在部署這個的Heroku服務器代碼TCP服務器,我不能再建立與服務器的TCP連接。

我的理解是服務器將在process.env.PORT中偵聽。

因此我首先找出服務器正在監聽的端口,例如30134.

然後如果我試圖以這種方式連接:

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

什麼也沒有發生。

我想我有一些根本性的誤解。任何人都可以引導我?在Heroku服務器上可以進行真正的TCP套接字聊天嗎?

+0

你的'Procfile'的內容是什麼? – Floby 2013-03-06 09:27:16

+0

web:node server.js – mkto 2013-03-06 09:31:50

回答

2

Heroku不支持websocket。這就是爲什麼,例如,socket.io需要被迫使用xhr-polling。 (見https://devcenter.heroku.com/articles/using-socket-io-with-node-js-on-heroku)。

不是直接使用套接字,而是使用類似支持多個傳輸的socket.io之類的東西。

這是因爲他們使用nginx的舊版本,它沒有完整的網絡套接字支持。

另外,您的應用正在偵聽的端口,e.g. 30134由nginx從端口80上的heroku主機名代理到您在heroku內部網絡上的應用端口。

+1

那麼HTTP是TCP。我想唯一不方便的是nginx會在某個時候超時請求。如果你真的需要TCP,你可以通過給nginx一個CONNECT方法來繞過這個。 – Floby 2013-03-06 09:34:19

+0

嗨帕斯卡,我知道真正的網絡套接字不支持在heroku中。正如在我的問題中提到的,我曾嘗試過socket.io,它的工作原理,但我不喜歡長時間輪詢比TCP套接字服務器慢的事實?不是websocket,而是原始的TCP套接字? – mkto 2013-03-06 09:36:57

+0

nginx僅適用於http,並且足以支持一些http/1。1,但不足以支持純TCP。特別是在無國籍的意義上。最近更新增加了對websocket的支持,但仍然不足以支持純TCP連接。所以你應該使用可以通過heroku的前端(nginx)的東西。 – 2013-03-06 09:38:25

2

我知道我很晚參加這個派對,但我寫了一個插件將原始TCP套接字路由到Heroku(https://addons.heroku.com/ruppells-sockets)以支持我正在開發的項目。它非常好,所以要溫柔。

如果你仍然需要這個功能,我很樂意得到一些反饋。 插件的文檔鏈接到示例nodejs TCP和Websocket聊天服務器以獲取靈感。