将WebSocket(socketo.me)连接到托管服务器时出现问题

时间:2018-10-07 07:29:51

标签: php sockets websocket ratchet phpwebsocket

当我尝试从连接到MySQL数据库(通过WebSocket用PHP编码)的本地主机运行聊天应用程序时,它成功。

当我尝试跑步时 从PuTTY终端登录到SSH凭据,它显示为服务器启动,端口号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端口,错误日志生成为

[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.php和{{1}中的排列组合来播放以下日志}

  

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

     

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

     

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

     

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


server.php,尤其是从域名为WebSocket的托管服务器连接时,我应该如何解决/克服问题

  

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

这是在执行并添加src文件夹http://somelabz.ml/chatroom-php-mysql

之后生成的作曲家文件

composer.json(在服务器上)

$composer require cboden/ratchet

composer.json(在本地主机上)

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

1 个答案:

答案 0 :(得分:0)

最终结论是

即使使用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上