当我尝试从连接到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"
}
}
答案 0 :(得分:0)
即使使用Node.js
,您将永远没有其他选择可以在转售商的帐户服务器上运行任何服务
解决方案在于更改我们的编码或升级/购买服务器:
首先,
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上