我在SO和网上阅读了很多关于我的问题标题中的关键词的帖子,并从中学到了很多.我读到的一些问题与具体的实施挑战有关,而其他问题则侧重于一般概念.我只是想确保我理解为什么技术X是在技术Y上发明的所有概念和原因等等.所以这里:
Http Polling:基本上是AJAX,使用XmlHttpRequest.
Http Long Polling: AJAX但服务器保持响应,除非服务器有更新,一旦服务器有更新,它发送它然后客户端可以发送另一个请求.缺点是需要来回发送额外的头数据会导致额外的开销.
Http Streaming:类似于长轮询,但是服务器使用带有"Transfer Encoding:chunked"的标头进行响应,因此每次服务器发送一些数据时我们都不需要发起新的请求(因此节省了额外的头部开销).这里的缺点是我们必须"理解"并找出数据的结构,以区分服务器发送的多个块.
Java Applet,Flash,Silverlight:它们提供了通过tcp/ip连接到套接字服务器的能力,但由于它们是插件,开发人员不希望依赖它们.
WebSockets:它们是新的API,它试图通过以下方式解决上述方法的缺点:
我还缺少其他重大差异吗?如果我重新询问或将SO上已有的许多问题合并到一个问题中,我很抱歉,但我只是想从SO和网络上有关这些概念的所有信息中完全理解.
谢谢!
我已经阅读了这个问题,但它并没有完全回答我的问题.不幸的是,自从我上次查看AJAX以来,看起来XHR对象中的内容发生了变化,因此responseText在完成填充之前不再可以直接访问.
我必须编写一个使用AJAX(最好是jQuery,但我愿意接受建议)的页面来从我无法控制的服务器通过HTTP检索CSV数据.响应数据可能非常大; 一兆字节的文本并不少见.
服务器是流友好的.是否有任何方法可以直接从JavaScript返回数据流?
我可以选择编写一些生活在中间的PHP代码并使用某种"Comet"技术(长轮询,EventSource等),但我希望尽可能避免这种情况.
如果它是相关的,假设这个问题用户有最新版本的Firefox/Chrome/Opera和旧的浏览器兼容性不是问题.
我正在尝试连接到执行json数据的http流的端点.我想知道如何使用Go的net/http包执行基本请求并在响应时读取响应.目前,我只能在连接关闭时读取响应.
resp, err := http.Get("localhost:8080/stream")
if err != nil {
...
}
...
// perform work while connected and getting data
Run Code Online (Sandbox Code Playgroud)
任何见解将不胜感激!
谢谢!
-RC
我正在尝试在Cedar堆栈上部署Sinatra流式SSE响应应用程序.不幸的是,虽然它在开发中完美运行,但是一旦部署到Heroku,callback或者errback在调用连接时永远不会被调用,导致连接池被填满过时的连接(永远不会超时,因为数据仍在服务器上发送给他们侧.)
来自Heroku文档的Relvant信息:
长轮询和流媒体响应
Cedar支持HTTP 1.1功能,例如长轮询和流式响应.应用程序有一个初始的30秒窗口,以单个字节响应客户端.但是,此后发送的每个字节(从客户端接收或由您的应用程序发送)重置滚动55秒窗口.如果在55秒窗口期间没有发送数据,则终止连接.
如果您要发送流响应,例如服务器发送的事件,则需要检测客户端何时挂断,并确保您的应用服务器立即关闭连接.如果服务器保持连接打开55秒而不发送任何数据,您将看到请求超时.
这正是我想要做的 - 检测客户端何时挂断,并立即关闭连接.然而,关于Heroku路由层的一些东西似乎阻止Sinatra像通常那样检测流关闭事件.
一些示例代码可用于复制此代码:
require 'sinatra/base'
class MyApp < Sinatra::Base
set :path, '/tmp'
set :environment, 'production'
def initialize
@connections = []
EM::next_tick do
EM::add_periodic_timer(1) do
@connections.each do |out|
out << "connections: " << @connections.count << "\n"
end
puts "*** connections: #{@connections.count}"
end
end
end
get '/' do
stream(:keep_open) do |out|
@connections << out
puts "Stream opened from #{request.ip} (now #{@connections.size} open)"
out.callback do
@connections.delete(out)
puts "Stream closed from #{request.ip} (now …Run Code Online (Sandbox Code Playgroud) 客户端定期调用异步方法(长轮询),向其传递一个股票代码的值,服务器使用该值来查询数据库并将对象返回给客户端.
我正在使用Spring的DeferredResult类,但是我不熟悉它的工作原理.请注意我如何使用symbol属性(从客户端发送)来查询数据库以获取新数据(见下文).
也许有更好的方法用于Spring的长轮询?
如何将symbol属性从方法deferredResult()传递给processQueues()?
private final Queue<DeferredResult<String>> responseBodyQueue = new ConcurrentLinkedQueue<>();
@RequestMapping("/poll/{symbol}")
public @ResponseBody DeferredResult<String> deferredResult(@PathVariable("symbol") String symbol) {
DeferredResult<String> result = new DeferredResult<String>();
this.responseBodyQueue.add(result);
return result;
}
@Scheduled(fixedRate=2000)
public void processQueues() {
for (DeferredResult<String> result : this.responseBodyQueue) {
Quote quote = jpaStockQuoteRepository.findStock(symbol);
result.setResult(quote);
this.responseBodyQueue.remove(result);
}
}
Run Code Online (Sandbox Code Playgroud) spring spring-mvc long-polling http-streaming server-sent-events
我正在尝试为内部应用程序构建一个流式传输解决方案,但我正在寻找一个解决问题的空白来克服障碍.目前,在我的工作示例中,我正在使用APE,但由于限制,我无法在主机上运行任何外部进程,因此无法运行APE服务器.
我正在寻找替代方案,但到目前为止我发现的所有东西都需要在服务器上运行进程.
关于该项目的一些细节.
任何人都有任何想法,如果node.js能够处理这个或任何其他解决方案?
是否可以将文件上传到apache php服务器而不包含内容长度标题?
我正在尝试将我正在创建的文件作为文件上传流式传输.当我不使用内容长度标题时,我得到了apache"501 Method Not Implemented".
$sock = fsockopen($host,80,$errno, $error);
fwrite($sock, "POST $resource HTTP/1.1\r\n" .
"Host: $host\r\n\r\n");
fwrite($sock,fread($readHandle,filesize($file)));
Run Code Online (Sandbox Code Playgroud)
如果我包含内容长度,它工作正常.
服务器正在从php://输入读取
我编写了一个HTTP-Server,它生成由JSON结构事件组成的无限HTTP流.与Twitter的流媒体API类似.这些事件由\n(根据服务器发送的事件和Content-Type:text/event-stream)分隔,并且长度可以不同.
回应是
我想尽快在Python中使用这些行,并尽可能节省资源,而不需要重新发明轮子.
由于我目前正在使用python-requests,你知道如何让它工作吗?如果您认为,python-requests在这里无法提供帮助,我对其他框架/库完全开放.
我当前的实现基于请求和iter_lines(...)接收线路的用途.但chunk_size参数很棘手.如果设置1为非常强大,因为某些事件可能是几千字节.如果设置为大于1的任何值,则某些事件会一直停留到下一个到达并且整个缓冲区"已填满".事件之间的时间可能是几秒钟.我期望它chunk_size是某种"接收的最大字节数",就像在unix中一样recv(...).相应的手册页说:
接收呼叫通常会返回任何可用的数据,直到请求的数量,而不是等待收到所请求的全部金额.
但这显然不是它在请求库中的工作方式.他们或多或少地使用它作为"接收的确切字节数".在查看源代码时,我无法确定哪个部分对此负责.也许httplib的Response或ssl的SSLSocket.
作为一种解决方法,我尝试将服务器上的线路填充到块大小的倍数.但是,请求库中的块大小用于从压缩响应流中获取字节.所以这不会起作用,直到我可以填充我的行,使他们的压缩字节序列是块大小的倍数.但这似乎太过于苛刻了.
我已经读过Twisted可以用于客户端上的http流的非阻塞,非缓冲处理,但我只找到了在服务器上创建流响应的代码.