2017-04-14 95 views
0

我一直在研究PHP Laravel應用程序,我一直在使用Redis和Node.JS連接到WebSocket。無法連接到Heroku上的Websockets

所以爲了實現這一點,我一直試圖在端口3000上運行節點服務器,但是heroku是動態分配端口的。

因此,我無法在客戶端獲得正確的端口號。

我該怎麼做才能解決它?

客戶端配置:

var socket = io.connect('http://app-around.herokuapp.com:3000'); 
    Note: Host Name is app-around.herokuapp.com 

後端運行正常,如下圖所示:

C:\xampp\htdocs\around-us>heroku run node socket.jsRunning node 
    socket.js on app-around... up, run.5567 (Free) 
    // Randomly generated port number it is.. 

    Message Recieved: {"event":"App\\Events\\NewMessage","data":{"data": 
    {"message":"Question Posted"}},"socket":null} 

所以越來越在服務器端生成的事件,但我不能接受他們在客戶端。試了幾件事情上的前端,但他們沒有工作:

Eg: 1) var socket = io.connect(); 
     2) var socket = io.connect(window.location.hostname); 

節點服務器代碼:

 var app = require('express')(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 
var Redis = require('ioredis'); 
var redis = require('redis').createClient(process.env.REDIS_URL); 

redis.subscribe('test-channel', function(err, count) { 

}); 

redis.on('message', function(channel, message) { 
    console.log('Message Recieved: ' + message); 

    message = JSON.parse(message); 

    io.emit(channel + ':' + message.event, message.data); 

    var temp = "data"; 
    io.emit("time", temp); 

}); 

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

http.listen(port, function(){ 
    console.log('Listening on Port 23000'); 
}); 

JS代碼,以便在前端側角應用:

var socket = io(); 

    socket.on("time",function(data){ 
      alert(data); 
    }); 
+0

當你遠程連接到Heroku時,請刪除端口號 - 網絡路由層將負責轉發HTTP(端口80)和HTTPS(端口443)到動態分配的端口。 – Myst

回答

0

在Node中,您應該從env變量中獲得端口:

server.listen(+process.env.PORT || 3000,() => { 
    Logger.info(`Listening on port ${process.env.PORT || 3000}...`); 
}); 

,並在IO客戶端,您不需要指定端口號:

io.connect('http://app-around.herokuapp.com')

+0

試過了,但它仍然沒有工作... –

+0

@HoneyThakuria你能分享你的socketIO服務器嗎? –

+0

@HoneyThakuria你從'http:// app-around.herokuapp.com/socket.io/socket.io.js'提供socketIO客戶端嗎? –

0

正如安德烈斯,服務器提到應收集來自環境的端口:

發展環境將不會有PORT變量,所以我們添加一個默認端口(您正在使用3000,這很常見)。

process.env.PORT || 3000 

客戶 - 和我假設一個瀏覽器 - 應該能夠使用HTTP URL地址自動識別目標服務器,連接到正確的WebSocket URL和端口。

我用下面的代碼的變化,當我不使用預製的庫(庫往往有自己的URL方案):

// websocket connects to root ("/") 
var ws_url = 
    document.location.origin.replace(/^http/i, "ws"); 
// OR web socket connects to full URL path (i.e. "/my/path") 
var ws_url = 
    document.location.href.replace(/^http/i, "ws"); 
0

我猜問題是在你的客戶端 變種socket = io.connect('http://app-around.herokuapp.com'); 試試這個或 var socket = io.connect(); 我希望它能幫到你

相關問題