【问题标题】:An Issue while connecting WebSocket (socketo.me) to the hosted server将 WebSocket (socketo.me) 连接到托管服务器时出现问题
【发布时间】:2019-03-12 04:28:40
【问题描述】:

当我尝试从连接到 MySQL 数据库的 localhost 运行聊天应用程序时,该数据库已通过 WebSocket 使用 PHP 进行编码,它成功了。

当我尝试跑步时 从 PuTTY 终端登录到 SSH 凭据,它显示为 Server Started with the port# 8383

somelabz@bh-ht-3 [~/public_html/chatroom-php-mysql/bin]# php server.php
Server Started.somelabz@bh-ht-3 [~/public_html/chatroom-php-mysql/bin]# php server.php
Server Started.

服务器以除8080以外的任何端口#启动。所以我决定用8383打开端口,结果它已经启动成功

使用端口 8080,error_log 生成为

[07-Oct-2018 06:11:02 Etc/GMT] PHP Fatal error:  Uncaught RuntimeException: Failed to listen on "tcp://0.0.0.0:8080": Address already in use in /home/somelabz/public_html/chatroom-php-mysql/vendor/react/socket/src/TcpServer.php:164
Stack trace:
#0 /home/somelabz/public_html/chatroom-php-mysql/vendor/react/socket/src/Server.php(36): React\Socket\TcpServer->__construct('tcp://0.0.0.0:8...', Object(React\EventLoop\StreamSelectLoop), Array)
#1 /home/somelabz/public_html/chatroom-php-mysql/vendor/cboden/ratchet/src/Ratchet/Server/IoServer.php(59): React\Socket\Server->__construct('0.0.0.0:8080', Object(React\EventLoop\StreamSelectLoop))
#2 /home/somelabz/public_html/chatroom-php-mysql/bin/server.php(15): Ratchet\Server\IoServer::factory(Object(Ratchet\Http\HttpServer), 8080)
#3 {main}
  thrown in /home/somelabz/public_html/chatroom-php-mysql/vendor/react/socket/src/TcpServer.php on line 164

server.php

<?php
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat;

require dirname(__DIR__) . '/vendor/autoload.php';

$server = IoServer::factory(
   new HttpServer(
     new WsServer(
          new Chat()
    )
   ),
   8383
);
$server->run();

chatroom.php

// For other computers to connect, you will probably need to change this to your LAN IP or external IP,
// alternatively use: gethostbyaddr(gethostbyname($_SERVER['SERVER_NAME']))
// $Server->wsStartServer($_SERVER['SERVER_ADDR'], 9300);
var conn = new WebSocket('ws://localhost:8383');
<script type="text/javascript">
        $(document).ready(function(){
            var conn = new WebSocket('ws://localhost:8383');
            conn.onopen = function(e) {
                console.log("Connection established!");
            };

    ...
</script>

从浏览器检查控制台信息当我尝试切换/更改域名以及端口# 使用文件chatroom.phpserver.php 中的排列和组合时,我得到了以下日志

var conn = new WebSocket('ws://localhost:8383');
var conn = 新 WebSocket('ws://192.197.161.61/~somelabz:8383');
var conn = 新 WebSocket('ws://somelabz.ml/chatroom-php-mysql:8383');
var conn = 新 WebSocket('ws://somelabz.ml:8383/');
var conn = 新 WebSocket('ws://192.197.161.61:8383/');

我以前遇到如下错误:

chatroom.php:73 WebSocket 连接到 'ws://somelabz.ml:8383/' 失败:连接建立错误: 网络::ERR_CONNECTION_TIMED_OUT

chatroom.php:73 WebSocket 连接到 'ws://192.197.161.61/~somelabz:8383' 失败:WebSocket 期间出错 握手:意外响应代码:404

到 'ws://somelabz.ml/chatroom-php-mysql:8383' 的 WebSocket 连接 失败:WebSocket 握手期间出错:意外的响应代码: 404

到 'ws://somelabz.ml:8383/' 的 WebSocket 连接失败:错误 连接建立:net::ERR_CONNECTION_TIMED_OUT

到“ws://192.197.161.61:8383/”的 WebSocket 连接失败:错误 连接建立:net::ERR_CONNECTION_TIMED_OUT


WebSocket 连接它时,我想如何解决/克服它,尤其是从具有http://somelabz.ml/chatroom-php-mysql 等域名的托管服务器

var conn = new WebSocket('ws://localhost:8383');

这是执行添加src文件夹$composer require cboden/ratchet后生成的composer文件

composer.json(在服务器上)

{
    "autoload": {
        "psr-4": {
            "MyApp\\": "src"
        }
    },
    "require": {
        "cboden/ratchet": "^0.4.1"
    }
}

composer.json(在本地主机上)

{
    "autoload": {
        "psr-4": {
            "MyApp\\": "src"
        }
    },
    "require": {
        "cboden/ratchet": "^0.4.3"
    }
}

【问题讨论】:

    标签: php sockets websocket ratchet phpwebsocket


    【解决方案1】:

    最后的结论是

    即使使用Node.js,您也永远无法在转销商帐户服务器上运行任何服务

    解决方案在于改变我们的编码或升级/购买服务器:

    1. AJAX 长池化
    2. 专用托管服务
    3. 虚拟专用服务器(VPS)

    首先,

    嗯,Bluehost 网站写道:

    “我们阻止访问某些端口以帮助避免出现安全漏洞 在防火墙中...购买专用 IP 将允许我们授予 您可以访问运行特定服务所需的端口 开。”。


    由于 BlueHost 服务器在特定端口上阻止传入套接字的请求是因为它们不允许共享主机上的 WebSocket。

    获得类似结果的唯一方法是使用 AJAX 长池或 我们需要升级到虚拟服务器来运行您自己的服务。

    我们不应该在网络中运行像 phpwebsocket 这样的脚本 服务(它本身就是一个服务器)。这让很多人感到困惑,因为 PHP 通常用于编写网页脚本,而不是用于编写守护进程

    我这样说是因为我提到过在 Xampp 中运行脚本,并将托管服务称为“Bluehost”。
    如果是这种情况,我们需要升级到虚拟服务器包,以便您可以运行自己的服务。

    最多有 65,535 个端口。 Web 服务器不能使用低于 1024 的端口作为监听套接字,
    因为在下面的大多数系统端口上,都需要 root 权限。 没有理智的供应商会以 root 身份运行 Web 服务器。这会影响所有 Linux 服务器。 这就是为什么它分别在 httpd-ssl.conf 和 httpd.conf 中具有端口# 443 和 80 的 Xampp 上工作的原因。我们需要有专门的服务器。至少是虚拟的。

    其次,

    在监听套接字之前,我必须先将它绑定到一个地址。 绑定到地址准确定义了哪个接口应该打开该服务器端口。 当您想监听接口知道的所有 IP 地址时,绑定到 0.0.0.0 是一种特殊情况。
    专门绑定到 127.0.0.1 应该使服务器端口仅对可以连接到本地主机的代码(例如本地进程)可见。 绑定可用于仅接受本地连接。如果您有多个 IP 地址,您还可以让不同的服务器监听 相同的端口,但在不同的 IP


    更新:

    就我而言,服务器不支持运行 Web 服务。有人可能会选择 GCP、Amazon、Heroku 等云服务。但它肯定会带来一些与之相关的间接成本,以防你试图在更长的时间内运行这些项目

    【讨论】:

      猜你喜欢
      • 2020-08-13
      • 2021-09-05
      • 2016-10-05
      • 1970-01-01
      • 2016-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多