我正尝试在我的网页伺服器上建立一个WebSocket。我想从我的客户端连接到websocket,以更新网站上的资料。然而,当我尝试连接时,在Postman中出现以下错误:
错误:意外的服务器响应:101握手详细信息请求URL:https://example.com:8443/radar请求方法:GET状态代码:101交换协议请求报头Sec-WebSocket-版本:13连接:升级升级:WebSocket Sec-WebSocket-扩展:预消息-放气;客户端最大窗口位数主机:example.com:8443响应标头日期:2023年3月11日星期六02:20:55 GMT服务器:Apache/2升级:WebSocket X技术支持者:乘客5.3.7状态:101交换协议各不相同:用户代理内容长度:2
为了监听端口8443,我在VirtualHosts(httpd.conf)中有以下内容:
Listen 8443
<VirtualHost 123.123.123.123:8443>
SSLEngine on
SSLCertificateFile /usr/local/directadmin/data/users/admin/domains/example.com.cert.combined
SSLCertificateKeyFile /usr/local/directadmin/data/users/admin/domains/example.com.key
ServerName www.example.com
ServerAlias www.example.com example.com
ServerAdmin webmaster@example.com
DocumentRoot /home/admin/domains/example.com/private_html
UseCanonicalName OFF
<IfModule !mod_ruid2.c>
SuexecUserGroup admin admin
</IfModule>
CustomLog /var/log/httpd/domains/example.com.bytes bytes
CustomLog /var/log/httpd/domains/example.com.log combined
ErrorLog /var/log/httpd/domains/example.com.error.log
# Allow WebSocket connections
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/radar [NC]
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/radar/(.*)$ wss://localhost:8443/radar/$1 [P,L]
<Directory /home/admin/domains/example.com/private_html>
AllowOverride AuthConfig FileInfo Indexes Limit Options=Indexes,IncludesNOEXEC,MultiViews,SymLinksIfOwnerMatch,FollowSymLinks,None
Options -ExecCGI -Includes +IncludesNOEXEC
php_admin_flag engine ON
php_admin_value sendmail_path '/usr/sbin/sendmail -t -i -f admin@example.com'
php_admin_value mail.log /home/admin/.php/php-mail.log
php_admin_value open_basedir /home/admin/:/tmp:/var/tmp:/opt/alt/php74/usr/share/pear/:/dev/urandom:/usr/local/lib/php/:/usr/local/php74/lib/php/
</Directory>
# Mail auto configuration (Thunderbird, MS Outlook)
ProxyPassMatch "^/\.well-known/autoconfig/mail/config-v1\.1\.xml$|^/([Aa]utodiscover)/\1\.xml$" "unix:/usr/local/directadmin/shared/internal.sock|http://localhost"
</VirtualHost>
NodeJS脚本的代码如下所示:
radar.js:
const http = require('http');
const WebSocketServer = require('websocket').server;
const fs = require('fs')
function writeHtml(outputStream) {
const inputStream = fs.createReadStream('index.html')
inputStream.pipe(outputStream)
outputStream.on('finish', () => {
console.log('served')
outputStream.end();
})
outputStream.on('error', (e) => {
console.error('errors', e)
outputStream.end();
})
}
const server = http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
writeHtml(res)
})
server.listen(process.env.PORT || 8443);
const wsServer = new WebSocketServer({
httpServer: server
});
wsServer.on('request', function(request) {
console.log("ws received")
const connection = request.accept(null, request.origin);
connection.on('message', function(message) {
console.log('Received Message:', message.utf8Data);
connection.sendUTF('Hi this is WebSocket server!');
});
connection.on('close', function(reasonCode, description) {
console.log('Client has disconnected.');
});
});
index.html:
<!DOCTYPE html>
<html>
<head>
<title>WebSocket Playground</title>
</head>
<body>
</body>
<script>
const ws = new WebSocket('wss://' + location.host);
ws.onopen = function() {
console.log('WebSocket Client Connected');
ws.send('Hi this is web client.');
};
ws.onmessage = function(e) {
console.log("Received: '" + e.data + "'");
};
</script>
</html>
我也尝试过修改虚拟主机,但没有任何效果。
我将感谢任何帮助,我可以得到,我也没有使用代理(如云耀斑等)。谢谢。
编辑:尝试使用ws代替,通过端口8880在一个非ssl连接与虚拟主机配置。仍然是同样的问题。
1条答案
按热度按时间bmvo0sr51#
您只需在客户端的连接字符串中添加一个额外的“s
用它替换