是否可以让Web服务器在没有Comet的情况下向Web浏览器发送消息?
像Facebook和谷歌这样的每个主要网络公司都使用Comet来实现这个目的,如果为主流浏览器启用了tcp连接,它就像是一个丑陋的黑客等待消失.
流媒体是一个可行的选择?根据我的选择,服务器端会有性能差异吗?这个案子比另一个好吗?
我正在使用运行在服务器端的Tomcat的GWT应用程序.为了了解我的需求,想象一下同时更新几种股票的股票价格.
(这个问题类似于这一个,但它的使用,而不是对彗星的iframe XMLHttpRequest的.)
我正在开始像这样的异步长轮询:
var xhr = new XMLHttpRequest();
xhr.open('POST', url);
xhr.send();
Run Code Online (Sandbox Code Playgroud)
如果我<script>...</script>在头部内部执行此操作,则会导致文档永远保持加载状态.(我在Mac OS X和iPhone上的Safari中测试它,它是我需要支持的唯一浏览器).
使用DOMContentLoaded或load事件将无法正常工作.
使用具有足够大延迟的setTimeout 将起作用.0将不会,1000将,100将有时,而不是其他时间.我对此感到不舒服.
我发现作品的唯一方法是两者的结合:
document.addEventListener('DOMContentLoaded', function () {
setTimeout(function () {
var xhr = new XMLHttpRequest();
xhr.open('POST', url);
xhr.send();
}, 0);
});
Run Code Online (Sandbox Code Playgroud)
我想现在这解决了这个问题,但是我仍然害怕它将来会破裂.//编辑:这也不能可靠地工作.
有谁知道更可靠的方式?
我正在使用脚本标签长轮询技术实现Comet,基于此页面.
一个问题(我认为没有解决方案)是"厄运的悸动" - 浏览器继续将文档显示为"正在加载"并启用工具栏上的"停止"按钮.这种品牌的意义,因为该文件是仍在加载,虽然它的效果并不理想,我想我可以住在一起.
第二个问题是,如果用户实际单击停止,则浏览器停止加载我的脚本标记,我必须依赖超时来重启Comet.这意味着如果我的超时是20秒,则在用户单击"停止"后,该页面最多可能不会更新20秒.我的问题是:有没有办法检测他们什么时候这样做?我可以使用onkeydown事件检测他们何时按下escape ,但是如果他们使用工具栏按钮或菜单项来停止加载则不会.
该解决方案需要在Firefox 3.5和Chrome 3.0中运行.
官方文档没有提到支持,但我想知道是否可以连接客户端程序而不是javascript来使用Channel API.我目前正在使用Windows应用程序的基本轮询技术,使用Channel API可以提高响应速度并减少负载.
我认为,作为一个丑陋的黑客,我可以在后台渲染一个隐藏的webbrowser对象,并在其中运行javascript,然后以此为基础.有更好的解决方案吗?
我正在寻找一个COMET服务器,我想将服务器上的消息专门推送到一些id的用户,我正在使用php,我正在寻找一个好的,简单的COMET服务器.
你能告诉我哪一个最好吗?
我正在使用NodeJS v0.4.8和最新版本的socket.io
npm install socket.io
在Ubuntu上:
Linux mars 2.6.38-8-generic#42-Ubuntu SMP Mon Apr 11 03:31:50 UTC 2011 i686 i686 i386 GNU/Linux
遗憾的是,以下代码不会在客户端或服务器端产生任何输出.
有人有线索吗?
var http = require('http'),
io = require('socket.io'),
fs = require('fs'),
sys = require('sys');
respcont = fs.readFileSync('testclient.js');
server = http.createServer(function(req, res){
res.writeHead(200, {'Content-Type': 'text/html'});
res.end(respcont);
});
server.listen(8082);
var socket = io.listen(server);
socket.on('connection', function(client){
sys.puts("New client is here!");
client.send("hello world");
client.on('message', function(msg) { sys.puts("client has sent:"+msg); }) ;
client.on('disconnect', function() { sys.puts("Client has disconnected"); }) ;
});
Run Code Online (Sandbox Code Playgroud)
<html> …Run Code Online (Sandbox Code Playgroud) 我正在使用play框架开发一个浏览器游戏,我肯定需要longpolling,但我不太明白如何使用它.WebSockets对于它来说是完美的,但它还没有得到那么多浏览器的支持.
这就是我想要做的事情:当用户登录并导航到游戏控制器时,我想开始连接并保持打开状态.我想为所有在线用户执行此操作,因此我可以在网站上显示这些用户的列表,以便他们可以互相玩耍.我查看了文档,但我不明白如何在我的情况下实现它.因为根本没有我想要计算的东西(在示例中他们正在生成pdf)我只想让连接保持打开状态.
我还想知道的是,我应该如何跟踪所有这些开放的连接?现在,我online在数据库的users表中只有一个列,我更新了.每次有人连接时我都要更新数据库.有没有更好的方法来做到这一点,还是这样好吗?
最后,假设以上所有工作.当玩家A选择玩家B玩时:如何通知玩家B?我只是发送一些JSON代码,并在播放器B的一侧用javascript更改页面,还是将他发送到一个完全不同的页面?当两个连接建立并且游戏已经开始时,我不确定如何通信.
我正在研究AJAX,因为我正在使用Javascript和PHP制作实时应用程序.它需要能够在不刷新页面的情况下进行更新并实时更新.
我尝试使用setInterval()轮询服务器但是为了快速我必须每秒都有它.它似乎使用了大量的带宽.它确实有效,我有一个计划与我的托管服务提供商'无限带宽'.虽然网站上有很多压力,但我想使用Push技术.
学习如何设置Push非常困难.从我设法弄清楚,你必须托管某种类型的推送服务器或彗星服务器.我也研究过websockets,但你也必须自己主持它.当我没有服务器计算机时,我不明白该怎么做,我的托管服务提供商网站上没有关于此的文档.
特定主机提供商是否为您托管推送服务器?有没有办法获得服务器而不必托管它?这似乎是一个比投票更好的选择,但同时它似乎非常令人困惑.
我已经实现了一个长轮询连接,允许我使用Tomcat Web服务器和前端的标准javascript进行服务器端推送(彗星).为了保持连接,我有一个简单的保持活动循环,一旦最后一个完成/失败就会启动一个新的请求.
绝大多数时候,这种连接完全正常,并且像我期望的那样保持活力.但是,我注意到当用户的互联网连接断开时(例如,他们断开VPN连接,拔掉他们的以太网等)并且我有一个待处理的XMLHttpRequest出服务器,我没有得到任何失败的迹象.因此,连接无声地死亡,我不知道它发生了,除非我经常向服务器发送请求以测试连接(这似乎打败了使用长轮询的目的).
这是我在Chrome中看到的请求对象,当它死于这个沉默的死亡时:
request: XMLHttpRequest
onabort: function ()
onerror: function ()
onload: null
onloadend: null
onloadstart: null
onprogress: null
onreadystatechange: function ()
readyState: 1
response: ""
responseText: ""
responseType: ""
responseXML: null
status: [Exception: DOMException]
statusText: [Exception: DOMException]
upload: XMLHttpRequestUpload
withCredentials: false
Run Code Online (Sandbox Code Playgroud)
我有三个监听器(onabort,onerror,onreadystatechange)设置来警告消息,如果它们被解雇,但每当我连接到服务器时,我什么也得不到.这是我正在形成请求的方式:
var request = new XMLHttpRequest();
//url is just the url to my servlet to handle this
request.open("GET", url, true);
//handlestatechange is just my standard handling code
//that I've put an alert at the top of
request.onreadystatechange …Run Code Online (Sandbox Code Playgroud) comet ×10
ajax ×4
javascript ×4
long-polling ×2
ajax-polling ×1
c# ×1
channel-api ×1
cometd ×1
events ×1
gwt ×1
java ×1
jquery ×1
node.js ×1
php ×1
real-time ×1
reverse-ajax ×1
socket.io ×1
streaming ×1
tcp ×1
websocket ×1