无法连接到Heroku上的Websockets
我一直在研究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);
});
在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')
试过了,但它仍然没有工作... –
@HoneyThakuria你能分享你的socketIO服务器吗? –
@HoneyThakuria你从'http:// app-around.herokuapp.com/socket.io/socket.io.js'提供socketIO客户端吗? –
正如安德烈斯,服务器提到应收集来自环境的端口:
发展环境将不会有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");
我猜问题是在你的客户端 变种socket = io.connect('http://app-around.herokuapp.com'); 试试这个或 var socket = io.connect(); 我希望它能帮到你
当你远程连接到Heroku时,请删除端口号 - 网络路由层将负责转发HTTP(端口80)和HTTPS(端口443)到动态分配的端口。 – Myst