javascript - PHP websocket 断开连接问题

标签 javascript php websocket

我已经测试了几个库(workermanPHP-Websockets),但在所有情况下我都遇到了同样的问题 - 当我打开客户端页面时一切正常,我与我的服务器建立了 websocket 连接,但稍后它断开连接几分钟或更短时间内自动。它是已知问题还是有任何方法可以处理它?或者我应该简单地实现一些功能以在 websocket 失败时强制重新连接?

这是workerman的代码示例

服务器 test_ws.php

<?php
require_once '/home/ubuntu/workspace/workerman/vendor/autoload.php';
use Workerman\Worker;

// Create a Websocket server
$ws_worker = new Worker("websocket://0.0.0.0:8082");

// 6 processes
$ws_worker->count = 6;

// Emitted when new connection come
$ws_worker->onConnect = function($connection)
{
    echo "New connection\n";
    $connection->send('Hello from server');
};

// Emitted when data received
$ws_worker->onMessage = function($connection, $data)
{
    // Send hello $data
    $connection->send('Data from server: ' . $data);
};

// Emitted when connection closed
$ws_worker->onClose = function($connection)
{
    echo "Connection closed\n";
};

// Run worker
Worker::runAll();

和客户端client.html

var socket = new WebSocket("wss://example.com:8082");
        
socket.onopen = function() {
   console.log("Connected.");
};

socket.onclose = function(event) {
   if (event.wasClean) {
      console.log('Connection closed');
   } else {
      console.log('Connection failure');
   }
   console.log('Code: ' + event.code + ' Reason: ' + event.reason);
};
        
socket.onmessage = function(event) {
   console.log("Data received: " + event.data);
};

socket.onerror = function(error) {
   console.log("Error: " + error.message);
};
            
function send() {
   socket.send("Hello!");
}
<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <meta http-equiv="X-UA-Compatible" content="ie=edge">
   <title>Workerman Sockets Test</title>
</head>
<body>
   <h3>Hello</h3>
   <button onclick="send()">Send Message</button>
</body>
</html>

所以,首先我启动 apache 服务器,然后通过控制台运行我的 websocket 脚本,websocket 服务器启动正常。然后我打开我的客户端网页,websocket 连接也建立得很好,但如果我等待大约 1 分钟或更短时间,它会无缘无故地失败。如何建立永久的 websocket 连接?任何建议将不胜感激。谢谢!

服务器

enter image description here

客户端

enter image description here

最佳答案

写在this article : “在建立 websocket 连接的情况下,服务器或防火墙可能会在一段时间不活动后超时并终止连接。”

这就是解决方案!

修改后的客户端页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Workerman Sockets Test</title>
</head>
<body>
    <h3>Hello</h3>
    <button onclick="send()">Send Message</button>
    <script type="text/javascript">
        var socket = new WebSocket("wss://example.com:8082");

        var timerID = 0; 
        function keepAlive() { 
            var timeout = 20000;  
            if (socket.readyState == socket.OPEN) {  
                socket.send('');  
            }  
            timerId = setTimeout(keepAlive, timeout);  
        }  
        function cancelKeepAlive() {  
            if (timerId) {  
                clearTimeout(timerId);  
            }  
        }

        socket.onopen = function() {
          console.log("Connected.");
          document.body.innerHTML += "<p>Connected.</p>";

          keepAlive();
        };

        socket.onclose = function(event) {
          if (event.wasClean) {
            console.log('Connection closed');
            document.body.innerHTML += "<p>Connection closed</p>";
          } else {
            console.log('Connection failure');
            document.body.innerHTML += "<p>Connection failure</p>";
          }
          console.log('Code: ' + event.code + ' Reason: ' + event.reason);
          document.body.innerHTML += "<p>Code: " + event.code + " Reason: " + event.reason + "</p>";

          cancelKeepAlive();
        };

        socket.onmessage = function(event) {
          console.log("Data received: " + event.data);
          document.body.innerHTML += "<p>Data received: " + event.data + "</p>";
        };

        socket.onerror = function(error) {
          console.log("Error: " + error.message);
          document.body.innerHTML += "<p>Error: " + event.message + "</p>";

          cancelKeepAlive();
        };

        function send() {
            socket.send("Hello");
        }
    </script>
</body>
</html>

希望对大家有所帮助。

关于javascript - PHP websocket 断开连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48932232/

相关文章:

javascript - rails : hide/close a rendered partial through a button in that partial

javascript - 去除特定屏幕宽度下的JS功能

javascript - 如何让侧边栏执行主文档中的 javascript 代码?

javascript - 在不使用jquery的情况下将g标签添加到svg标签中

php - 如何选择要检查的 session 数组和数据库项

php - 相当于 PHP 的 javascript 卸载

php - 将 Javascript 结果与 PHP 集成的最佳方法

WebSockets、WebRTC、UDP : how to communicate with esp8266 real-time

concurrency - Java Web Socket ServerEndpoint 线程安全

java - websocket 双向概念如何工作?