I'm writing a backend for a mobile web-app based in Java and I was wondering as far as scalability and ease of use go what are the pros and cons associated with using WebSockets versus Long-Polling solutions like comet. Another option would also be implementing my own solution using TCP. From what I've read it seems that you need to run Long-polling solutions on dedicated servers as they don't run well in Tomcat/Jetty when you start dealing with large numbers …
我正在使用MVC 2中的长轮询开发一个简单的陌生人聊天应用程序.如果我打开应用程序不同的浏览器,它在我的开发机器上工作正常..我的意思是如果我在IE和Mozilla中加载应用程序,它工作正常
如果我在浏览器的两个选项卡中使用该应用程序(例如:IE),则不会从两个选项卡中触发长轮询...我的意思是,有一个开始按钮来启动聊天,这会触发长时间轮询.我可以看到它在调试时调用动作..而我的问题是,当我从第一个选项卡中单击启动按钮时,它会触发ajax请求(长轮询(此请求在服务器上等待,直到另一个请求来))然后我单击在选项卡2中的启动按钮,它不会触发ajax请求,直到从服务器返回第一个请求(超时后).
为什么会这样?我阅读像浏览器将阻止多个ajax请求..这是一个原因吗?..如果我使用不同的浏览器,它工作正常.只有在同一个浏览器中选择了两个选项卡才会出现问题
我想开始在我的网站上实现一些"长轮询"技术.
基本上我需要一个主要功能,刷新HTML列表是否已将新数据添加到数据库.
对于我的设置,我有一个带LAMP环境的入门级VPS服务器.我知道PHP,JS和我熟悉Unix系统.
什么是正确的技术来实现一些长期的民意调查效果?
非常感谢任何投入
我有一个客户端/服务器应用程序使用服务器上的nodejs和socket.io作为连接机制.由于与我的应用程序相关的原因,我希望每个浏览器只有一个活动连接,并拒绝来自其他选项卡的所有连接,这些连接可能会在会话期间稍后打开.这个伟大的工程使用WebSockets,但是如果的WebSockets不是由浏览器和XHR轮询支持来代替,断开不会发生,因此,如果用户只需刷新页面,这不被解释为再连接(我有一个延迟重新连接和会话恢复),但作为一个新选项卡,在连接中结束被拒绝,因为此相同选项卡生成的旧连接仍处于活动状态.
我正在寻找一种方法,以便在发生刷新时从客户端有效地结束连接.我已经尝试绑定到客户端beforeunload并调用socket.disconnect()它,并且还发送了一条消息,socket.emit('force-disconnect')并且触发了与服务器的断开连接,但没有成功.我在这里错过了什么吗?感谢您的帮助!
我已经阅读了这个问题,并且发现它对我的特定情况没有用.
我想建立一个基于JavaScript(jQuery将用于AJAX)和PHP的聊天.
我听说这样做的好方法是使用长轮询.
我理解这个想法,但我不知道如何在服务器端实现它.
无限循环听起来像个坏主意.
我试图让我的瓶子服务器,以便当游戏中的一个人注销时,每个人都可以立即看到它.当我使用长轮询时,会向所有用户打开请求.
我遇到问题的一点是捕获当用户从长轮询中离开页面时抛出的异常,该轮询不能再连接到页面.错误消息在这里.
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/gevent/pywsgi.py", line 438, in handle_one_response
self.run_application()
File "/usr/lib/python2.7/dist-packages/gevent/pywsgi.py", line 425, in run_application
self.process_result()
File "/usr/lib/python2.7/dist-packages/gevent/pywsgi.py", line 416, in process_result
self.write(data)
File "/usr/lib/python2.7/dist-packages/gevent/pywsgi.py", line 373, in write
self.socket.sendall(msg)
File "/usr/lib/python2.7/dist-packages/gevent/socket.py", line 509, in sendall
data_sent += self.send(_get_memory(data, data_sent), flags)
File "/usr/lib/python2.7/dist-packages/gevent/socket.py", line 483, in send
return sock.send(data, flags)
error: [Errno 32] Broken pipe
<WSGIServer fileno=3 address=0.0.0.0:8080>: Failed to handle request:
request = GET /refreshlobby/1 HTTP/1.1 from ('127.0.0.1', 53331)
application = <bottle.Bottle object at …Run Code Online (Sandbox Code Playgroud) 我想我在这里做错了,也许有人可以澄清一下.我有一个应用程序长期轮询CouchDB(通过nodejs),它使用更改源.当我的应用程序首次轮询更改提要时,它不知道last_seq是什么,所以我刚刚开始使用自= = 0轮询,获取last_seq然后再使用since = last_seq进行轮询.
但是,我遇到了一个问题.由于我的数据库已经添加了更多文档,因此更改列表变得非常长,当我使用since = 0请求更改时,响应似乎被切断,我没有得到响应中的last_seq.因此,如果没有last_seq,我就无法提出后续请求.
有没有办法获得last_seq而不从一开始就获得AAAAALLLL的变化?是否有某种方法可以经常截断更改Feed?
我使用以下方法开发了一个javascript聊天(后端的php):
1) long-polling to get new messages for the receiver
2) sessionStorage to store the counter of messages
3) setInterval to read new messages and if sessionStorageCounter < setIntervalCounter then the last message is shown to receiver.
4) javascript to create,update and write the chat dialogues
Run Code Online (Sandbox Code Playgroud)
该模块工作正常,但当用户快速聊天时,接收者的前端会收到两到三条相同的消息,(计数器都不会失败,查询也不会提供双重插入).
代码似乎是正确的(这就是我不提供代码的原因),因此间隔延迟可能是原因(在减少间隔延迟时,没有任何变化).
您是否认为上述架构是一种不好的做法,您认为哪种架构可以消除错误?
我的应用程序有一个页面,用户必须在该页面上相对实时地查看如何处理2个步骤.
现在这是通过ajax短轮询完成的.我想把它改成一些服务器重量较少的技术,我选择Faye gem和ajax long-polling.
Ajax长轮询更容易实现,不需要任何服务器入侵.它将需要4个ajax请求(用于完成2个步骤的页面).
Faye gem将发送3个请求,这并不是很少.它需要我设置我的nginx-passenger服务器,并且更难以实现和支持.
我会选择ajax长轮询,但我听说它需要一个完整的Rails实例运行,而请求是长轮询的,这将耗尽我的RAM.另一方面,从这个如何生产的rails服务器工作?我知道Rails在长轮询中可能没有这个问题.那么,这是真的, - 来自多个客户端的ajax长轮询需要许多并发应用程序处理(这可能会占用我的一些资源,不确定哪些)?
如果我从XAMPP上的本地服务器加载此脚本的chrome:
header("Content-Type:text/plain");
set_time_limit(0);
$max = 40;
for ($i = 0; $i < $max; $i++) {
$response = array( 'server time: ' . date("h:i:s", time()), 'progress' => round($i/$max*100));
echo json_encode($response);
ob_flush();
flush();
sleep(1);
}
ob_clean();
Run Code Online (Sandbox Code Playgroud)
它按预期工作,每秒页面显示一个新的响应.但是,当我将其上传到我的远程服务器(运行相同版本的php)时,它会等到整个脚本完成后再显示输出.在非常长的脚本上,它每30-60秒左右更新一次输出.
正如标题所示,我尝试使用所有不同的刷新功能,但没有任何作用.我的本地服务器和远程服务器的php.ini可能有些不同,但我不知道是什么.
请帮忙.
- -编辑 - -
我一直在做更多的测试.我注意到它确实只更新每4096个字节,这恰好是我的远程服务器的'output_buffering'的php ini值.但是,出于某种原因,如果我将output_buffering更改为"1"或"关闭",则不会发生任何变化.它仍然只更新每4096个字节.
我正在同一浏览器上的不同服务器上测试2个相同的脚本.
long-polling ×10
jquery ×2
node.js ×2
php ×2
websocket ×2
ajax ×1
asp.net-mvc ×1
bottle ×1
chat ×1
comet ×1
couchdb ×1
faye ×1
feed ×1
flush ×1
java ×1
javascript ×1
long-integer ×1
passenger ×1
python ×1
python-2.7 ×1
setinterval ×1
socket.io ×1
xmpp ×1