当前位置: 首页 > 面试题库 >

如何通过服务器端事件重新启动所有连接的浏览器

韩耘豪
2023-03-14
问题内容

假设存在一个包含动态生成内容的网页-
例如,一个div包含当前已连接浏览器的数量。当服务器上的计数更改时,我希望所有连接的浏览器重新加载计数,以便每个人都可以看到增量/减量。

做到这一点的最佳方法是什么?

关键字:ajax,广播,浏览器,div,jquery


问题答案:

这是使用ajax长轮询进行服务器推送的方法。浏览器发出一个ajax请求,该请求启动服务器端自轮询。Ajax请求保持打开状态,等待响应,直到文件更改为止,并​​且一旦获得响应,它就会发出一个新的长轮询请求。

这是jQuery和php的外观,实现了在html中实时更新div的示例,该示例显示了当前连接的客户端数量:

index.html:

<html>
<head>
<title>Comet Test</title>
  <script type="text/javascript" src="jquery.js"></script>
  <script type="text/javascript" src="longpolling.js"></script>
</head>
<body>
  Number of connected users: <div id="total">0</div>
</body>
</html>

longpolling.js:

$(document).ready(function() { connectToServer(1); });

function connectToServer( incp ) {
  $.get("LongPolling.php",
        { inc: incp },
        function(resp) {
          $('#total').html(resp);
          connectToServer(0);
        }
       );
}

LongPolling.php:

<?php

# (over)write file with contents, locking the file while doing so.
# just barf and die if there's an error.
function update($file, $contents)
{
  $f = fopen($file, 'w');
  if(!$f) { echo "ERROR1"; exit; } # couldn't open file for writing.
  if(!flock($f, LOCK_EX)) { echo "ERROR2"; exit; } # couldn't get lock.
  fwrite($f, $contents);
  fclose($f);  # this also releases the lock.
  return $contents;
}

# fetch the contents of the given file.
# if the file doesn't exist, create it with contents "0"
function fetch($file)
{
  if(file_exists($file)) {
    if(!is_readable($file)) { echo "ERROR3"; exit; }
    $x = file_get_contents($file);
  } else {
    $x = 0;
    update($file, $x);
  }
  return $x;
}

$fc = 'connx.txt';   # file that stores the number of connections.

if ( $_REQUEST['inc'] == 1 ) {  # someone just connected.
  echo update($fc, fetch($fc)+1);
} else {  # someone is reconnecting (also happens immediately after connect).
  $last = filemtime($fc);
  do {  # wait until some other instance causes $fc to change...
    sleep(1);
    clearstatcache(); # otherwise filemtime() results are cached!
  } while(filemtime($fc) == $last);
  echo fetch($fc);
}
?>

注意:这不会跟踪断开连接,因此它更像是实时跟踪浏览量的总数。



 类似资料:
  • 问题内容: 在Node.js中,我将websockets / ws 用于WebSocket连接。下面是客户端的代码。假设我们要连接的服务器套接字关闭了一分钟。关闭事件将触发,但是每当服务器上的套接字出现故障或错误时,重新连接到套接字的最佳方法是什么? 问题答案: 我已经成功使用https://github.com/joewalnes/reconnecting- websocket/blob/mas

  • 问题内容: 我有一个RMI服务器和一个桌面RMI客户端。重新启动服务器时,客户端出现错误。是否可以在不重新启动客户端的情况下重新启动RMI连接? [编辑]这是堆栈跟踪: 问题答案: 服务器终止后,您将收到一个ConnectException。之后,您可以使用Naming.lookup获取新的服务器对象。

  • 我突然遇到了硒和铬驱动的错误问题。我还没有改变一件事,但我遇到了这些错误信息。这个脚本在几个小时前就开始工作了,现在没有任何调整,它不工作了。 这是我对应的代码: 更奇怪的是,当打开新终端、加载python并从selenium import webdriver中键入时,我没有收到任何错误。但是,当我导航到脚本所在的文件夹,并从selenium import webdriver加载python和类型

  • 我正在尝试启动selenium web浏览器,我可以打开火狐浏览器,但无法打开谷歌帮助我解决我面临的这个错误 线程“main”org.openqa.selenium.WebDriverException中的hello world异常:等待Firefox启动45秒时超时。构建信息:版本:“3.14.0”,修订版:“AACCCCE0”,时间:“2018-08-02T20:05:20.749Z”系统信息

  • 我正在使用单节点独立zookeeper运行一个带有zookeeper发现SPI机制的单节点Apache Ignite服务器。 我正在尝试使用下面的发现SPI配置从客户端应用程序连接Ignite服务器,如下所示 请提供在zookeeper重新启动后客户端自动重新连接的配置。

  • (这个问题的灵感来自对此线程的响应:WebSocket 服务器如何处理多个传入的连接请求? 我的理解是这样的: 假设客户端 IP = 1.1.1.1,服务器 IP = 9.9.9.9 > 浏览器选择一个随机的本地可用端口,例如 5555,并启动与服务器端口 80 的连接。因此,在客户端上,应表示 IP 连接,例如 (1.1.1.1 服务器在其端口80上调用并识别来自客户端的连接请求。然后服务器选择