首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将WebSocket (socketo.me)连接到宿主服务器时出现的问题

问将WebSocket (socketo.me)连接到宿主服务器时出现的问题
EN

Stack Overflow用户
提问于 2018-10-07 07:29:50
回答 1查看 1.4K关注 0票数 1

当我试图从连接到MySQL数据库的本地主机上运行聊天应用程序时,这个应用程序是通过WebSocket编写的,它是成功的。

另外,当我试图从登录到SSH凭据的PuTTY终端运行时,它显示为服务器启动时使用port# 8383

代码语言:javascript
复制
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以外的任何port#启动。因此,当我决定用8383打开港口时,它已经成功地启动了。

与端口8080,error_log被生成为

代码语言:javascript
复制
[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

代码语言:javascript
复制
<?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

代码语言:javascript
复制
// 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>

从浏览器中检查控制台信息,当我试图切换/更改域名时,我会从浏览器中获得以下日志,以及port#,用于处理排列& chatroom.php和server.php文件中的组合

var conn =新的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/‘失败:连接建立中的错误: net::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 到'ws://192.197.161.61:8383/‘的WebSocket连接失败:连接建立中的错误: net::ERR_CONNECTION_TIMED_OUT

​

我应该如何解决/克服从WebSocket ,特别是从托管服务器与域名(如 http://somelabz.ml/chatroom-php-mysql )连接起来的问题?

​

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

这是在执行和添加src文件夹$composer require cboden/ratchet之后生成的编写器文件。

composer.json(On )

代码语言:javascript
复制
{
    "autoload": {
        "psr-4": {
            "MyApp\\": "src"
        }
    },
    "require": {
        "cboden/ratchet": "^0.4.1"
    }
}

composer.json(On localhost)

代码语言:javascript
复制
{
    "autoload": {
        "psr-4": {
            "MyApp\\": "src"
        }
    },
    "require": {
        "cboden/ratchet": "^0.4.3"
    }
}
EN

回答 1

Stack Overflow用户

发布于 2018-10-08 08:13:20

最后的结论是

即使使用Node.js,在再卖方的帐户服务器上运行任何服务也没有任何其他选择

解决方案要么是改变我们的编码,要么是升级/购买服务器:

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

--首先,

好吧,Bluehost网站写道:

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

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

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

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

我这么说是因为我提到了在Xampp中运行脚本,并将托管服务称为“Bluehost”。

如果是这样的话,我们需要升级到一个虚拟服务器包,以便您可以运行自己的服务。

有多达65,535个港口。web服务器不能使用低于1024的端口作为侦听套接字,

因为在大多数系统中,下面的端口都需要根权限。没有一个正常的提供者会以root用户的身份运行web服务器。这影响到所有Linux服务器。这就是为什么它分别与httpd-ssl.conf和httpd.conf中的Xampp一起使用httpd.conf 443和80的原因。我们需要有专门的服务器。至少虚拟的。

其次,

在侦听套接字之前,我必须先将它绑定到一个地址。绑定到地址可以准确地定义哪个接口应该打开该服务器端口。绑定到0.0.0.0是一个特例,当您想要侦听接口所知道的所有IP地址时。

具体绑定到127.0.0.1应该使服务器端口只对能够连接到本地主机(例如本地进程)的代码可见。绑定只能用于接受本地连接。如果您有多个IP地址,您也可以让不同的服务器监听同一端口,但在不同的IP上

更新:

在我的例子中,服务器不支持运行web服务。对于某个人来说,这是可能的&选择像GCP、Amazon、Heroku和rest等云服务。但是,如果您试图在较长的时间内运行这些项目,则肯定会产生一些与此相关的间接成本。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52686375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档