WebSocket突然拒绝连接
WebSocket suddenly refuses connection
对于我的项目,我需要一个VPS,所以我在DigitalOcean上买了一个。我安装了MongoDB、Laravel,整个程序都在Nginx上运行。
今天早些时候,我问了一个关于计时器的问题,建议使用WebSockets。根据评论,最好的方法是将NodeJS与Socket.io一起使用。我也这么做了。
我在这里(本地)学习了本教程,在localhost上完全没有问题。
因此,我的下一步是将代码上传到我的Web服务器,并将其与Laravel相结合。我在建立连接时遇到了一些问题,但在我找到这个Stackoverflow帖子后,它终于奏效了。服务器正在发送Date对象,屏幕上的计时器正在实时更新。
但只有当我通过node
终端命令手动启动脚本时,它才起作用。因此,我遵循了这篇关于DigitalOcean的教程,在那里,即使在我关闭终端/从VPS注销时,也可以使用PM2来继续运行脚本。一切都很好,计时器还在更新,我真的很惊讶我没有遇到那么多问题。。
直到5分钟后。突然之间,WebSocket停止了工作。也许我在没有意识到的情况下打错了字,也许服务器注意到了代码中的一些变化,但我没有注意到。我不知道,但当我在开发者控制台上查看时,它说:
GET http://<my-domain-ip>:8080/socket.io/?EIO=3&transport=polling&t=LF8I2CO net::ERR_CONNECTION_REFUSED
当然,我在谷歌上搜索了很多,并根据(主要)堆栈溢出的答案对我的代码进行了各种更改,但现在我真的没有什么想法,完全不知道为什么我的代码不起作用。
server.js文件:
var http = require('http');
var url = require('url');
var fs = require('fs');
var io = require('socket.io');
var server = http.createServer(function (request, response) {
var path = url.parse(request.url).pathname;
switch(path) {
case '/' :
response.writeHead(200, { 'Content-Type' : 'text/html'});
response.write('hello world');
response.end();
break;
case '/socket.html' :
fs.readFile(__dirname + path, function (error, data) {
if(error) {
response.writeHead(404);
response.write("Oops, this doesn't exist - 404");
response.end();
} else {
response.writeHead(200, {'Content-Type' : 'text/html'});
response.write(data, 'utf8');
response.end();
}
});
break;
default :
response.writeHead(404);
response.write("Oops, this doesn't exist - 404");
response.end();
break;
}
});
server.listen(8080, '<private ip>');
console.log('Server running at http://<private ip>:8080/');
var listener = io.listen(server);
listener.sockets.on('connection', function (socket) {
setInterval(function () {
socket.emit('date', {'date' : new Date()});
});
});
(我必须根据DigitalOcean教程设置一个私有IP,这样Nginx才能让它发挥作用)。
客户端的Javascript代码:
<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>
<script>
var baseURL = getBaseURL(); // Call function to determine it
var socketIOPort = 8080;
var socketIOLocation = baseURL + socketIOPort; // Build Socket.IO location
var socket = io(socketIOLocation);
//Build the user-specific path to the socket.io server, so it works both on 'localhost' and a 'real domain'
function getBaseURL()
{
baseURL = location.protocol + "//" + location.hostname + ":" + location.port;
return baseURL;
}
socket.on('date', function (data) {
$('#date').text(data.date.getHours() + ':' + data.date.getMinutes() + ':' + data.date.getSeconds());
})
</script>
如果我没记错的话,我还设置了一些选项,比如proxy_pass
和Upgrade $upgrade
,但我不记得我在哪里读到了那个文件/我把它应用到了哪个文件,但据我所知,这些选项设置正确。
有人知道问题出在哪里吗?因为我真的没有什么想法了。
提前感谢!
托管公司通常有"管理"长期运营的方法连接以保留其资源。一种可能性是主机基础架构需要经过长期的专门配置运行webSocket连接以便nginx(或网络设备)在一段时间后不会自动杀死它时间。这并不是所有主机都通用的东西,而是特定于您的特定VPS的配置特定的托管公司,所以你必须得到任何指导他们的这个话题。
可能的帮助:http://nolanlawson.com/2013/05/31/web-sockets-with-socket-io-node-js-and-nginx-port-80-considered-harmful/
我改了:
server.listen(8080, <private ip>);
至:
server.listen(443);
和:
var socketIOPort = 8080;
至:
var socketIOPort = 443;
多亏了jfriend00,WebSockets立即开始工作了!
- 是否可以将一个函数输入连接到另一个函数调用的文本
- 如何使用密码检测网络中的状态连接
- 在流星上使用微信js-sdk时出现拒绝权限错误
- 如何处理node.js节点mongodb中的连接和查询队列
- Rails-JQueryUIAutcomplete和AJAX不工作,可以't连接到数据库
- Twilio-显示所有连接参与者的远程参与者视频
- Mootools:拒绝设置不安全的标头“;连接”;
- WebSocket突然拒绝连接
- 业务催化剂原型核心.ashx 拒绝设置不安全的标头“连接”冲突
- Localhost 拒绝来自 Javascript 的连接
- 运行Selenium-webdriver时拒绝连接
- nodejs + WebSockets - 拒绝带有消息的连接
- 连接被拒绝!硒服务器是否启动
- 强 PM 始终显示连接被拒绝
- 错误连接拒绝http://localhost:3000/socket.io/socket.io.js.
- 尝试运行代码I'我写了一个奇怪的错误,连接被拒绝,还有一个JavaScript错误
- Phonegap GaPlugin拒绝连接
- Docker -为什么这个带有公开/发布端口的express.js容器会拒绝连接?(使用boot2docker)
- 如何处理“拒绝设置不安全标头:连接”
- 使用thrift nodejs连接hbase时拒绝连接