VPS部署Ratchet+ReactPHP WebSocket服务器:端口占用自动重启及WSS连接失败问题求助
VPS部署Ratchet+ReactPHP WebSocket服务器:端口占用自动重启及WSS连接失败问题求助
我现在在VPS上用Ratchet和ReactPHP搭建WebSocket聊天服务器,碰到了两个棘手的问题,实在搞不定来求助大家!
首先是端口被占的问题:执行server.php启动服务器时,直接弹出致命错误:
PHP Fatal error:
Uncaught RuntimeException:
Failed to listen on "tcp://0.0.0.0:2053":
Address already in use (EADDRINUSE)
in /var/www/meetwithchat/vendor/react/socket/src/TcpServer.php:188
更奇怪的是,我找到占用2053端口的进程杀掉之后,马上就有新的进程自动重启并绑定这个端口,根本没法释放出端口给我的服务器程序用。
然后就是客户端连接失败的问题,Chrome浏览器控制台里一直刷这个错误:
WebSocket connection to 'wss://meetwithchat.com:2053/' failed:
下面是我的相关代码:
服务器代码 server.php
<?php use Ratchet\MessageComponentInterface; use Ratchet\ConnectionInterface; require __DIR__ . '/vendor/autoload.php'; class ChatServer implements MessageComponentInterface { // [Properties and constructor omitted for brevity] public function onOpen(ConnectionInterface $conn) { // [Code omitted for brevity] } public function onMessage(ConnectionInterface $from, $msg) { // [Code omitted for brevity] } // Additional methods (matchUsers, endChatForBoth, onClose, onError)... } // Create the event loop $loop = React\EventLoop\Factory::create(); // Set up the SSL context $context = [ 'ssl' => [ 'local_cert' => '/etc/ssl/certs/cloudflare_origin.crt', 'local_pk' => '/etc/ssl/private/cloudflare_origin.key', 'allow_self_signed' => true, 'verify_peer' => false ] ]; // Create a TCP socket listening on all interfaces on port 2053 $socket = new React\Socket\Server('0.0.0.0:2053', $loop); // Wrap it with SSL $secureSocket = new React\Socket\SecureServer($socket, $loop, $context); // Set up the WebSocket server $server = new Ratchet\Server\IoServer( new Ratchet\Http\HttpServer( new Ratchet\WebSocket\WsServer( new ChatServer() ) ), $secureSocket, $loop ); error_log("Secure WebSocket server is running on port 2053..."); $server->run(); ?>
客户端代码 script.js
let ws = new WebSocket("wss://meetwithchat.com:2053/"); ws.onopen = function () { // Send initial messages to set gender and preference ws.send(JSON.stringify({ type: "setGender", gender: genderValue })); ws.send(JSON.stringify({ type: "setPreference", preference: preferenceValue })); }; ws.onmessage = function (event) { const data = JSON.parse(event.data); if (data.type === "match") { // Handle a successful match } else if (data.type === "message") { // Append message to chat UI } else if (data.type === "chatEnded") { alert("Partner has left the chat. Chat ended!"); resetChat(); } }; ws.onclose = function () { resetChat(); };
备注:内容来源于stack exchange,提问作者Mustafa Uğur Baskın
相关产品推荐
相关产品推荐

