2016-11-29 49 views
0

我試圖通過WebSocket連接連接到服務器的NodeJS服務器,但無法得到任何工作。如何使遠程WebSocket連接到的NodeJS在Heroku

我server.js看起來是這樣的:

var app = require('express')(); 
var http = require('http').createServer(app); 
var io = require('socket.io', { 
    transports: ['websocket'] 
})(http); 

var server_port = process.env.PORT || 8080 
var server_ip_address = process.env.IP || '0.0.0.0' 

app.listen(server_port, server_ip_address, function() { 
    console.log('listening on ' + server_ip_address + ":" + server_port); 
}); 

我client.js(上樹莓派也運行運行的NodeJS)是:

var io = require('socket.io-client'); 
var socket = io.connect('http://<app-url>', 
    { 
     reconnect: true, 
     transports: ['websocket'] 
    } 
); 

socket.on('connect', function(socket) { 
    console.log('Connected!'); 
}); 

我也試過openshift V2 (端口8000和8443)和v3,那裏沒有運氣。

如果有人這樣做了最近請讓我知道怎麼回事,謝謝!

在調試客戶端我得到的消息:

engine.io客戶端:插座插座親近的理由: 「傳輸錯誤」

,並在服務器上:

heroku [router]:at =錯誤代碼= H13 desc =「連接沒有響應關閉」

+0

在客戶端和服務器都在同一臺機器上運行,通過本地主機訪問? – Melkor

+0

@Marchhill無 - 服務器在Heroku上託管,客戶端上的樹莓派(與互聯網連接)。 – Matthew

回答

1

好吧,它現在工作。我修改了heroku docs

的例子,我不明白爲什麼我的服務器配置無法正常工作,但下面不工作:

server.js

var express = require('express'); 
var socketIO = require('socket.io'); 
var path = require('path'); 

var PORT = process.env.PORT || 3000; 

var app = express(); 
var server = app.listen(PORT,() => console.log(`Listening on ${ PORT }`)); 

var io = socketIO(server); 

io.on('connection', (socket) => { 
    console.log('Client connected'); 
    socket.on('disconnect',() => console.log('Client disconnected')); 
}); 

client.js( xShirase說得我所需要的正確的路徑在這裏...)

var io = require('socket.io-client'); 
var socket = io.connect('https://<url>', 
    {reconnect: true, transports : ['websocket'], path: '/socket.io'}); 

socket.on('connect', function (socket) { 
    console.log('Connected!'); 
}); 
+0

感謝的人:D。 https:// /。不要忘記'/'最後的網址.... –

0

看起來有時是會發生一個奇怪的錯誤,你應該能夠通過添加客戶端庫的路徑,像這樣的選項打通:

var socket = io.connect('http://<app-url>:8080', 
    { 
     reconnect: true, 
     transports: ['websocket'], 
     path: "/lib/socket.io.js" //use the relevant path for your file 
    } 
); 

但你似乎無論如何要使用默認選項,所以你可以這樣做:

var socket = io.connect(); 
+0

謝謝,我試過使用一個路徑 - 這將是一個路徑到端點連接套接字的權利?我沒有對socket.io託管js文件,因爲我確實運行內部節點... – Matthew

+0

,我忽略了你的客戶也對節點。儘管在node_modules中有一條路徑,但值得一試。我有相同的問題一次,不記得我究竟是如何固定它 – xShirase

+0

嗯,我試過node_modules路徑,但它似乎使用輪詢XHR這似乎是默認時的路徑追加到GET請求...... – Matthew