当我尝试从连接到 MySQL 数据库的本地主机运行聊天应用程序时(该数据库通过 WebSocket 用 PHP 编码),它成功了。
此外,当我尝试从登录 SSH 凭据的 PuTTY 终端运行时,它显示为服务器已启动,端口号为 8080
ubuntu@ec3-193-123-96:/home/admin/web/ec3-193-123-96.eu-central-1.compute.amazonaws.com/public_html/application/libraries/server$ php websocket_server.php
PHP Fatal error: Uncaught React\Socket\ConnectionException: Could not bind to tcp://0.0.0.0:8080: Address already in use in /home/admin/web/ec3-193-123-96.eu-central-1.compute.amazonaws.com/public_html/application/libraries/vendor/react/socket/src/Server.php:29
Stack trace:
#0 /home/admin/web/ec3-193-123-96.eu-central-1.compute.amazonaws.com/public_html/application/libraries/vendor/cboden/ratchet/src/Ratchet/Server/IoServer.php(70): React\Socket\Server->listen(8080, '0.0.0.0')
#1 /home/admin/web/ec3-193-123-96.eu-central-1.compute.amazonaws.com/public_html/application/libraries/server/websocket_server.php(121): Ratchet\Server\IoServer::factory(Object(Ratchet\Http\HttpServer), 8080)
#2 {main}
thrown in /home/admin/web/ec3-193-123-96.eu-central-1.compute.amazonaws.com/public_html/application/libraries/vendor/react/socket/src/Server.php on line 29
ubuntu@ec3-193-123-96:/home/admin/web/ec3-193-123-96.eu-central-1.compute.amazonaws.com/public_html/application/libraries/server$
所以我尝试将端口#8080 更改为端口#8282,成功了
ubuntu@ec3-193-123-96:/home/admin/web/ec3-193-123-96.eu-central-1.compute.amazonaws.com/public_html/application/libraries/server$ php websocket_server.php
保持 shell 脚本运行,打开几个 Web 浏览器窗口,并使用以下 Javascript 打开 Javascript 控制台或页面:
var conn = new WebSocket('ws://0.0.0.0:8282');
conn.onopen = function(e) {
console.log("Connection established!");
};
conn.onmessage = function(e) {
console.log(e.data);
};
从浏览器控制台结果:
与 'ws://5.160.195.94:8282/' 的 WebSocket 连接失败:建立连接时出错:net::ERR_CONNECTION_TIMED_OUT
我甚至尝试分配公共 IP 和私有 IP,但没有用,结果还是一样?
我该如何解决/克服从 WebSocket 连接时的问题,特别是从具有域名的托管服务器连接时,例如 http://ec3-193-123-96.eu-central-1.compute.amazonaws.com/
var conn = new WebSocket('ws://localhost:8383');
我们需要如何设置虚拟服务器来在 AWS EC2 实例中运行自己的服务?
更新:
来自安全组
答案1
检查 EC2安全组与实例关联的允许访问您的所有端口,8282、8383 等。
另外,您的 JS 代码尝试连接的 IP 或主机名是什么?它是 EC2 实例公共/弹性 IP 吗?应该是。其他方法都行不通。
通常,JS 代码会回调提供网页的同一服务器,即如果 URL 是https://www.example.com/然后 JavaScrips 将连接回 ws://www.example.com:8282/ - 不要对主机名进行硬编码,而是使用 URL 中使用的任何内容。它可能是 IP 地址、规范名称或某个 ec2-12-34-56-78.eu-west-2... 地址,无论用户输入什么,所有这些都应该有效。
希望有帮助:)