【发布时间】:2018-02-05 04:36:22
【问题描述】:
我有这个问题,我从未遇到过,而且我发现的所有其他帖子都对我没有帮助。
事实上,我在受 SSL 保护的网站上使用带有 Express 和 Socket.io 的 NodeJS,但出现此错误:“WebSocket connection to 'wss://site.domain:8001/socket.io/?EIO= 3&transport=websocket' failed: WebSocket在连接建立之前就关闭了。"
所以我在互联网上搜索,发现了很多有趣的东西,甚至有人和我有完全相同的问题,但没有人回答他们,有时它只是不起作用。
我有 2 个文件,正常情况下,我有一个名为“server.js”的服务器文件和一个名为“agent.php”的客户端文件。
server.js
var fs = require('fs');
var https = require('https');
var mysql = require('mysql');
var express = require('express');
var app = express();
var options = {
key: fs.readFileSync('/var/www/html/site.domain/public_html/cert/domain.key'),
cert: fs.readFileSync('/var/www/html/site.domain/public_html/cert/domain.pem')
};
var serverPort = 8001;
var server = https.createServer(options, app);
var io = require('socket.io')(server);
app.get('/', function(req, res) {
res.sendFile(__dirname + '/public/index.html');
});
var con = mysql.createConnection({
host: "127.0.0.1",
user: "user",
password: "password",
database: "dbname"
});
con.connect(function(err) {
if (err) throw err;
console.log("Connected to mysql!");
});
io.on('connection', function(socket) {
console.log('new connection');
});
server.listen(serverPort, function() {
console.log('server up and running at %s port', serverPort);
});
按预期在控制台中写入“服务器已启动并在 8001 端口运行”会产生此结果。但是由于我认为的错误,当您加载页面时不会打印“新连接”。
agent.php
<!DOCTYPE HTML>
<html>
<head>
<title>TERMINAL - AGENT</title>
<link rel="stylesheet" type="text/css" href="/assets/css/agent.css?version=<?php $v=rand(100,9999999999); echo $v;?>">
<link rel="stylesheet" type="text/css" href="/assets/css/main.css?version=<?php $v=rand(100,9999999999); echo $v;?>">
<link rel="shortcut icon" href="/images/favicon.ico" type="image/x-icon">
<link rel="icon" href="/images/favicon.ico" type="image/x-icon">
<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
<link href="https://fonts.googleapis.com/css?family=Cairo|Pontano+Sans:400,600|Rajdhani:400,600|Teko:400,600|Titillium+Web:400,600|Exo:400,600|Open+Sans+Condensed:400,600|sans-serif|Anton:400,600|VT323|Grand+Hotel|Anonymous+Pro:400,400i,700,700i" rel="stylesheet">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script>
</head>
<body>
*A lot of html stuff which is not important at all*
<script type="text/javascript">
<?= 'var mat = '.htmlspecialchars($_GET['mat']).';' ?>
$( document ).ready(function (){
var url = window.location.protocol + "//" + window.location.hostname + ":8001";
var socket = io(url, {transports: ['websocket'], upgrade: false});
});
</script>
</body>
</html>
结果是错误。我现在真的不知道该怎么办,我已经使用了我所有的知识并且我也进行了很多搜索。
【问题讨论】:
-
您是否 100% 确定您在客户端和服务器上拥有相同版本的 socket.io,因为当它们不匹配时,它会表现出与您描述的完全相同的症状。如果您将
<script src="/socket.io/socket.io.js"></script>用于客户端socket.io 库,那么您将始终获得正确的版本,因为它将由socket.io 服务器自动提供。 -
另外,
var socket = io();工作还是有同样的问题? -
好吧,我知道 /socket.io/socket.io.js 但我从来没有让它工作,事实上我在使用它时总是遇到 3 个错误。 1. /socket.io/socket.io.js 上的 404 2. io 未定义 3. io 未定义 gyazo.com/486da3a68beef01cd1abd38012cc7cf5 您可以看到 404(GET url)在页面“civil”而不是“agent”但它是“代理”的副本
-
您的网页是否来自您的 socket.io 服务器所在的同一台服务器?如果您连接到同一主机,那么
/socket.io/socket.io.js应该可以正常工作。或者你想连接到一些不同的主机?另外,您是否检查了我第一条评论中的 socket.io 版本? -
我检查了版本以及服务器和客户端(导入时),但它不工作。我在同一台服务器上使用客户端和服务器,该服务器是 ovh 租用的 VPS,也是 var socket = io();没有解决任何问题。
标签: javascript node.js express socket.io