سلام وقتتون بخیر
من یک هاست اشتراکی دارم از میزبان فا در هاست دسترسی به ترمینال وجود داره
قصد دارم از وب سوکت استفاده کنم پشتیبان هاست اعلام کرده که پورت 80 و 443 برای ایجاد وب سوکت بازه و میتونید استفاده کنید وقتی از این پورت ها استفاده میکنم خطایی رو میده بر مبنای اینکه این پورت ها درحال استفاده هستند و نمیتوانی از انها استفاده کنی
و پورت های استفاده نشده رو قرار میدهم در بخش ترمینال خطایی ندارد ولی و در بخش کلاینت به وب سوکت متصل نمیشه به پشتیبان هاست اعلام کردم ولی نمتونن کمکم کنند
کد سرور
<?php
require 'vendor/autoload.php';
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
class ChatServer implements MessageComponentInterface
{
protected $clients;
public function __construct()
{
$this->clients = new \SplObjectStorage;
}
public function onOpen(ConnectionInterface $conn)
{
$this->clients->attach($conn);
echo "New connection: ({$conn->resourceId})\n";
}
public function onMessage(ConnectionInterface $from, $msg)
{
foreach ($this->clients as $client) {
if ($from !== $client) {
$client->send($msg);
}
}
}
public function onClose(ConnectionInterface $conn)
{
$this->clients->detach($conn);
echo "Connection {$conn->resourceId} has disconnected\n";
}
public function onError(ConnectionInterface $conn, \Exception $e)
{
echo "Error: {$e->getMessage()}\n";
$conn->close();
}
}
use Ratchet\App;
$server = new App('example.com', 80);
$server->route('/chat', new ChatServer, ['*']);
$server->run();
کد کلاینت
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WebSocket Chat</title>
</head>
<body>
<h1>WebSocket Chat</h1>
<div id="messages" style="border: 1px solid #000; height: 300px; overflow-y: scroll;"></div>
<input type="text" id="messageInput" placeholder="Type a message..." style="width: 80%;">
<button id="sendButton">Send</button>
<script>
const ws = new WebSocket('wss://example.com:80/chat');
ws.onmessage = (event) => {
const messages = document.getElementById('messages');
const newMessage = document.createElement('div');
newMessage.textContent = event.data;
messages.appendChild(newMessage);
};
document.getElementById('sendButton').addEventListener('click', () => {
const input = document.getElementById('messageInput');
ws.send(input.value);
input.value = '';
});
</script>
</body>
</html>
ممنون میشم اگر راهنمایی کنید
در هاستهای اشتراکی به دلیل محدودیتهای امنیتی و منابع، معمولاً دسترسی به اجرای سرورهای وبسوکت مستقیم وجود ندارد، حتی اگر پورتهای 80 و 443 باز باشند. دلیل این است که این پورتها از قبل توسط وبسرور (مانند Apache یا Nginx) برای ارائه صفحات وب استفاده میشوند، و شما نمیتوانید یک سرور وبسوکت جداگانه روی همان پورت اجرا کنید.
راهحلها برای اجرای وبسوکت در هاست اشتراکی
1.استفاده از یک سرویس واسطه برای وبسوکت
یکی از سادهترین راهحلها این است که از سرویسهای مدیریت وبسوکت مثل Pusher یا Socket.IO Cloud استفاده کنید. این سرویسها نیاز به دسترسی مستقیم به پورتهای خاص ندارند و شما میتوانید از API آنها در پروژه خود استفاده کنید.
استفاده از هاست جداگانه یا VPS
اگر نیاز دارید که وبسوکت را مستقیماً مدیریت کنید، میتوانید از یک VPS یا هاست اختصاصی استفاده کنید که در آن آزادی کامل برای باز کردن پورتهای دلخواه و اجرای سرور وبسوکت دارید.
اجرای وبسوکت روی پورت 80 یا 443 از طریق PHP
اگر بخواهید وبسوکت را با PHP و روی هاست اشتراکی اجرا کنید، میتوانید از یک کتابخانه مانند Ratchet استفاده کنید. اما در هاست اشتراکی این روش اغلب با مشکلاتی همراه است، زیرا:
پورتهای 80 و 443 معمولاً در حال استفاده هستند.
روش جایگزین با استفاده از PHP و WebSocket پشت پورت 80/443
در این روش، وبسرور (Apache یا Nginx) درخواستهای مربوط به وبسوکت را به یک سرور PHP که روی پورت داخلی دیگری اجرا میشود، پروکسی میکند.
مراحل:
برای Apache:
<VirtualHost *:80>
ServerName yourdomain.com
ProxyRequests Off
ProxyPass /ws ws://127.0.0.1:8080/
ProxyPassReverse /ws ws://127.0.0.1:8080/
</VirtualHost>
برای Nginx:
location /ws {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
ایجاد سرور وبسوکت با PHP و Ratchet:**
یک سرور ساده با PHP و Ratchet ایجاد کنید:
<?php
require 'vendor/autoload.php';
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use Ratchet\Server\IoServer;
class Chat {
public function onOpen($conn) {
echo "New connection! ({$conn->resourceId})\n";
}
public function onMessage($from, $msg) {
echo "Message received: {$msg}\n";
}
public function onClose($conn) {
echo "Connection closed! ({$conn->resourceId})\n";
}
}
$server = IoServer::factory(
new HttpServer(new WsServer(new Chat())),
8080
);
$server->run();
این کد را ذخیره کرده و با استفاده از خط فرمان اجرا کنید:
php server.php
استفاده از کلاینت جاوااسکریپت:
کلاینت باید به مسیر /ws
متصل شود:
const socket = new WebSocket("wss://yourdomain.com/ws");
socket.onopen = () => {
console.log("Connected to WebSocket!");
};
socket.onmessage = (event) => {
console.log("Message from server:", event.data);
};
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟