如何在用户不刷新浏览器的情况下不断地向用户浏览器显示更新

How to continuosly display updates to user browser WITHOUT user refreshing the browser

本文关键字:用户 浏览器 显示 更新 情况下 刷新      更新时间:2023-09-26

首先,让我设置一个舞台:我是一个新用户,这是我的第一个帖子。我通常使用Ruby来解决我的简单问题,这是我遇到的唯一类型的问题。我遇到过一个问题,99%的人告诉我,我需要使用JavaScript来解决它。当然,我不懂JavaScript,今天我花了8个多小时阅读JavaScript初学者教程。在这段漫长的序言之后,让我告诉你我需要做什么,也许Stackoverflow社区可以推荐一些工具或为我指出正确的源代码。

我有一个UNIX服务器生成一个24x7的日志,其中包含每秒或更快更新的信息。每天晚上我们砍木头,一根新的木头开始。我用Ruby编写了一个简单的应用程序,使用Ruby流行的GUI工具包之一shoe,它运行起来没有任何问题。在任何桌面,你都可以运行以下应用程序:

  1. 连接到UNIX服务器
  2. 从日志文件
  3. 读取最新的更新
  4. 在仪表板上显示最新的更新,无需用户干预。用户只需要启动应用程序,从那一刻起,它每秒钟自动刷新一次。

上述方法的问题在于,为了让任何人都能使用它,我需要在这个人的桌面上安装Ruby和它的所有需求,包括工具包。

我想:

  1. 编写一个应用程序,在创建日志的服务器上运行。
  2. 允许任何用户通过浏览器(HTTP)连接到我的应用程序的页面
  3. 用户将离开
  4. 我的应用程序将在没有人为干预的情况下持续更新用户打开的仪表板(浏览器上的页面)。
  5. 任何有浏览器的人都应该能够同时做到这一点。

谁能指出我需要使用的正确技术,也许是一些示例或代码片段?

XMLHttpRequest()对象允许您创建到服务器的HTTP请求。浏览器不需要刷新,但是客户端需要反复询问服务器是否有新的内容,所以网络流量很高。

WebSockets更适合你。使用node.js,你可以创建websocket server.

服务器代码

var http = require('http');
var WebsocketServer = require("websocket").server;
var httpServer = http.createServer(function(){});
httpServer.listen(/*port*/ 9822, function(){});
var wsServer = new WebsocketServer({httpServer: httpServer});

…与客户沟通

wsServer.on('request', function(request) {
  var connection = request.accept(null, request.origin);    
  // respond to client request
  connection.on('message', function(message) {
    connection.send(data);
  });
  // or create an event on the client without its request
  if(something) connection.send(data);
});

客户端可以使用websockets连接服务器

客户机代码

ws = new WebSocket('ws://' + server + ':9882');
// create request
ws.send(data);
// handle request
ws.onmessage = function(message) { ... }

你可以尝试使用AJAX和jQuery

http://api.jquery.com/jQuery.ajax/

我建议你使用WebSockets。

当实际有数据需要推送时,服务器可以推送数据。不需要从客户端轮询(节省带宽和实时更新)。它与升级为套接字连接的标准HTTP连接(以及HTTPS)一起工作。

当你说你不熟悉Javascript(这在任何情况下都是必须的),你可以通过使用使用WebSocket的许多包装器库之一来缓解"开始"曲线(包括在浏览器不支持WebSocket的情况下的回退模式)。

无论如何,我建议您阅读规范,以了解发生了什么。

几个建议:
http://socket.io/
http://xsockets.net/

我个人更喜欢SignalR,但这需要一个。net支持的服务器(然而它与Linux上的Mono兼容)。