محمد مهدی امیری
1 هفته پیش توسط محمد مهدی امیری مطرح شد
1 پاسخ

ایجاد وب سوکت

سلام وقتتون بخیر
من یک هاست اشتراکی دارم از میزبان فا در هاست دسترسی به ترمینال وجود داره
قصد دارم از وب سوکت استفاده کنم پشتیبان هاست اعلام کرده که پورت 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>

ممنون میشم اگر راهنمایی کنید


ثبت پرسش جدید
حمد علی حسام
تخصص : کارمند گارانتی
@alihesam111 1 هفته پیش مطرح شد
0

در هاست‌های اشتراکی به دلیل محدودیت‌های امنیتی و منابع، معمولاً دسترسی به اجرای سرورهای وب‌سوکت مستقیم وجود ندارد، حتی اگر پورت‌های 80 و 443 باز باشند. دلیل این است که این پورت‌ها از قبل توسط وب‌سرور (مانند Apache یا Nginx) برای ارائه صفحات وب استفاده می‌شوند، و شما نمی‌توانید یک سرور وب‌سوکت جداگانه روی همان پورت اجرا کنید.

راه‌حل‌ها برای اجرای وب‌سوکت در هاست اشتراکی

1.استفاده از یک سرویس واسطه برای وب‌سوکت
یکی از ساده‌ترین راه‌حل‌ها این است که از سرویس‌های مدیریت وب‌سوکت مثل Pusher یا Socket.IO Cloud استفاده کنید. این سرویس‌ها نیاز به دسترسی مستقیم به پورت‌های خاص ندارند و شما می‌توانید از API آن‌ها در پروژه خود استفاده کنید.

  1. استفاده از هاست جداگانه یا VPS
    اگر نیاز دارید که وب‌سوکت را مستقیماً مدیریت کنید، می‌توانید از یک VPS یا هاست اختصاصی استفاده کنید که در آن آزادی کامل برای باز کردن پورت‌های دلخواه و اجرای سرور وب‌سوکت دارید.

  2. اجرای وب‌سوکت روی پورت 80 یا 443 از طریق PHP
    اگر بخواهید وب‌سوکت را با PHP و روی هاست اشتراکی اجرا کنید، می‌توانید از یک کتابخانه مانند Ratchet استفاده کنید. اما در هاست اشتراکی این روش اغلب با مشکلاتی همراه است، زیرا:

  • شما نمی‌توانید وب‌سرور اصلی (Apache/Nginx) را تغییر دهید.
  • پورت‌های 80 و 443 معمولاً در حال استفاده هستند.

    روش جایگزین با استفاده از PHP و WebSocket پشت پورت 80/443
    در این روش، وب‌سرور (Apache یا Nginx) درخواست‌های مربوط به وب‌سوکت را به یک سرور PHP که روی پورت داخلی دیگری اجرا می‌شود، پروکسی می‌کند.

    مراحل:

    1. تنظیم Proxy در Apache/Nginx (نیاز به دسترسی به تنظیمات سرور دارد):**
      اگر دسترسی دارید، در فایل تنظیمات وب‌سرور، درخواست‌های وب‌سوکت را به پورت دیگری (مثلاً 8080) ارسال کنید.

    برای 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";
    }
  1. ایجاد سرور وب‌سوکت با 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
  2. استفاده از کلاینت جاوااسکریپت:
    کلاینت باید به مسیر /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);
    };

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام