当我试图从连接到MySQL数据库的本地主机上运行聊天应用程序时,这个应用程序是通过WebSocket编写的,它是成功的。
另外,当我试图从登录到SSH凭据的PuTTY终端运行时,它显示为服务器启动时使用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以外的任何port#启动。因此,当我决定用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 164server.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>从浏览器中检查控制台信息,当我试图切换/更改域名时,我会从浏览器中获得以下日志,以及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 )
{
"autoload": {
"psr-4": {
"MyApp\\": "src"
}
},
"require": {
"cboden/ratchet": "^0.4.1"
}
}composer.json(On localhost)
{
"autoload": {
"psr-4": {
"MyApp\\": "src"
}
},
"require": {
"cboden/ratchet": "^0.4.3"
}
}发布于 2018-10-08 08:13:20
最后的结论是
即使使用Node.js,在再卖方的帐户服务器上运行任何服务也没有任何其他选择
解决方案要么是改变我们的编码,要么是升级/购买服务器:
--首先,
好吧,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等云服务。但是,如果您试图在较长的时间内运行这些项目,则肯定会产生一些与此相关的间接成本。
https://stackoverflow.com/questions/52686375
复制相似问题