Храповик открыт, клиент не выстрелил
Я пытаюсь реализовать слово приветствия Ratchet Socket Hello на моей локальной машине, все работает отлично, но на VPS Centos Server, когда я запускаю службу сервера с
ssh Command : php chat-server.php
он начинает прослушивание порта правильно (я вижу в linux, что порт прослушивания), но когда я открываю страницу "clint.html", метод onopen
никогда не срабатывает, но сервер говорит
новый клиент подключен!
и через 2 минуты это говорит
клиент отключен
если я отправлю сообщение клиенту, это займет 2 минуты, тогда клиент получит его, но он снова отключится, мне кажется, что между сервером и клиентом нет стабильной связи. каждый раз, когда я проверяю websocket.readyState, он не равен 1
Я отключил брандмауэр и любую защиту на VPS-сервере, но все еще имею эту проблему. Я должен отметить, что нормальные функции сокета php работают без проблем, потому что я мог бы проверить это, и все работает, но насчет храповика кажется, что он зависает onopen
метод.
- порт 9091 открыт
- брандмауэр отключен
- abrandao.com/2013/06/websockets-html5-php/ устраняет проблему с перебоями и может отправлять и получать сообщения от клиентов
НО Храповик имеет проблемы при подключении
chat-server.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() ) ), 9091 ); echo date("Y-m-d H:i:s")." chat-server Started on port 9091 \n"; $server->run();
Класс Chat.php:
namespace MyApp; use Ratchet\MessageComponentInterface; use Ratchet\ConnectionInterface; class Chat implements MessageComponentInterface { protected $clients; public function __construct() { $this->clients = new \SplObjectStorage; } public function onOpen(ConnectionInterface $conn) { $this->clients->attach($conn); echo date("Y-m-d H:i:s")." New connection! ({$conn->resourceId})\n"; $conn->send("Hello {$conn->resourceId} from server at : ".date("Y-m-d H:i:s")); echo date("Y-m-d H:i:s")." Hello Sent to ({$conn->resourceId})\n"; } public function onMessage(ConnectionInterface $from, $msg) { $numRecv = count($this->clients) - 1; echo sprintf(date("Y-m-d H:i:s").'Connection %d sending message "%s" to %d other connection%s' . "\n" , $from->resourceId, $msg, $numRecv, $numRecv == 1 ? '' : 's'); foreach ($this->clients as $client) { if ($from !== $client) { $client->send($msg); } } } public function onClose(ConnectionInterface $conn) { $this->clients->detach($conn); echo date("Y-m-d H:i:s")." Connection {$conn->resourceId} has disconnected\n"; } public function onError(ConnectionInterface $conn, \Exception $e) { echo date("Y-m-d H:i:s")." An error has occurred: {$e->getMessage()}\n"; $conn->close(); } }
HTML-код клиента:
$(document).ready(function(){ connect(); }); var wsUri = "ws://myserverdomain.comOrIP:9091"; function connect() { var ws = new WebSocket(wsUri); ws.onopen = function() { var now = new Date(); console.log(now + ' Connected to '+wsUri); }; ws.onmessage = function(e) { var now = new Date(); console.log(now + ' Message Recived From Server :', e.data); }; ws.onclose = function(e) { var now = new Date(); console.log(now +' Socket is closed. Reconnect will be attempted in 1 second.', e.reason); setTimeout(function() { connect(); }, 1000) }; ws.onerror = function(err) { var now = new Date(); console.error(now + ' Socket encountered error: ', err.message, 'Closing socket') console.error(err) ws.close() }; }