标签: http-streaming

我对HTTP轮询,长轮询,HTTP流和WebSockets的理解

我在SO和网上阅读了很多关于我的问题标题中的关键词的帖子,并从中学到了很多.我读到的一些问题与具体的实施挑战有关,而其他问题则侧重于一般概念.我只是想确保我理解为什么技术X是在技术Y上发明的所有概念和原因等等.所以这里:

Http Polling:基本上是AJAX,使用XmlHttpRequest.

Http Long Polling: AJAX但服务器保持响应,除非服务器有更新,一旦服务器有更新,它发送它然后客户端可以发送另一个请求.缺点是需要来回发送额外的头数据会导致额外的开销.

Http Streaming:类似于长轮询,但是服务器使用带有"Transfer Encoding:chunked"的标头进行响应,因此每次服务器发送一些数据时我们都不需要发起新的请求(因此节省了额外的头部开销).这里的缺点是我们必须"理解"并找出数据的结构,以区分服务器发送的多个块.

Java Applet,Flash,Silverlight:它们提供了通过tcp/ip连接到套接字服务器的能力,但由于它们是插件,开发人员不希望依赖它们.

WebSockets:它们是新的API,它试图通过以下方式解决上述方法的缺点:

  • 与Java Applet,Flash或Silverlight等插件相比,WebSockets的唯一优势是WebSockets本身内置于浏览器中,不依赖于插件.
  • WebSockets优于http流的唯一优势是您不必努力"理解"并解析收到的数据.
  • WebSockets优于长轮询的唯一优势是消除额外的标头大小以及为请求打开和关闭套接字连接.

我还缺少其他重大差异吗?如果我重新询问或将SO上已有的许多问题合并到一个问题中,我很抱歉,但我只是想从SO和网络上有关这些概念的所有信息中完全理解.

谢谢!

javascript web-applications comet websocket http-streaming

113
推荐指数
3
解决办法
3万
查看次数

jQuery逐步读取AJAX流?

我已经阅读了这个问题,但它并没有完全回答我的问题.不幸的是,自从我上次查看AJAX以来,看起来XHR对象中的内容发生了变化,因此responseText在完成填充之前不再可以直接访问.

我必须编写一个使用AJAX(最好是jQuery,但我愿意接受建议)的页面来从我无法控制的服务器通过HTTP检索CSV数据.响应数据可能非常大; 一兆字节的文本并不少见.

服务器是流友好的.是否有任何方法可以直接从JavaScript返回数据流?

我可以选择编写一些生活在中间的PHP代码并使用某种"Comet"技术(长轮询,EventSource等),但我希望尽可能避免这种情况.

如果它是相关的,假设这个问题用户有最新版本的Firefox/Chrome/Opera和旧的浏览器兼容性不是问题.

ajax jquery javascript-events long-polling http-streaming

70
推荐指数
4
解决办法
7万
查看次数

长轮询/ HTTP流媒体一般问题

我正在尝试使用创建一个理论上的网络聊天应用程序,我已经阅读了有关长轮询和http流的内容,并且我设法应用了文章中介绍的大多数原则.然而,有两个主要的事情我仍然无法理解.

随着长轮询

  • 服务器如何知道何时发送更新?是否需要不断查询数据库或有更好的方法吗?

使用HTTP Streaming

  • 如何在Ajax连接期间检查结果是否仍处于活动状态?我知道jQuery的successajax调用函数,但是如何在连接仍在进行检查数据?

我会感激任何和所有的答案,谢谢你提前.

php jquery comet long-polling http-streaming

19
推荐指数
2
解决办法
6399
查看次数

如何使用Golang的net/http包读取流式响应主体?

我正在尝试连接到执行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

http go http-streaming

18
推荐指数
2
解决办法
2万
查看次数

Rails使用HAML进行HTTP流式传输

在rails中使用HTTP流与HAML项目似乎存在问题.如果我改用ERB,它的效果非常好.显然,我不是唯一有这个问题的人.

放置stream在控制器的顶部或render :stream => true在操作中使用它不起作用.

如何让HAML和HTTP流媒体很好地一起播放?

更新:我在宝石的页面上打开了一个问题,这里.

haml http-streaming ruby-on-rails-3.1

12
推荐指数
1
解决办法
1099
查看次数

在Heroku上没有使用Sinatra/Thin检测到HTTP流连接(SSE)客户端断开连接

我正在尝试在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)

ruby heroku thin sinatra http-streaming

12
推荐指数
1
解决办法
1515
查看次数

使用Spring的DeferredResult进行长轮询

客户端定期调用异步方法(长轮询),向其传递一个股票代码的值,服务器使用该值来查询数据库并将对象返回给客户端.

我正在使用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

11
推荐指数
1
解决办法
7938
查看次数

使用Node.js或任何其他Comet解决方案进行流式处理

我正在尝试为内部应用程序构建一个流式传输解决方案,但我正在寻找一个解决问题的空白来克服障碍.目前,在我的工作示例中,我正在使用APE,但由于限制,我无法在主机上运行任何外部进程,因此无法运行APE服务器.

我正在寻找替代方案,但到目前为止我发现的所有东西都需要在服务器上运行进程.

关于该项目的一些细节.

  • 一次将连接约25人
  • 理想情况下,每个人都应该在可用时立即看到更新.
  • 它将在Windows环境中运行,因此C#/ .NET解决方案将优于PHP之类的东西.

任何人都有任何想法,如果node.js能够处理这个或任何其他解决方案?

javascript c# asp.net comet http-streaming

9
推荐指数
1
解决办法
2001
查看次数

如何在没有Content-Length标头的情况下流式传输HTTP文件?

是否可以将文件上传到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://输入读取

php apache http http-streaming

8
推荐指数
1
解决办法
9516
查看次数

在压缩的,分块的HTTP流到达时有效地读取行

我编写了一个HTTP-Server,它生成由JSON结构事件组成的无限HTTP流.与Twitter的流媒体API类似.这些事件由\n(根据服务器发送的事件和Content-Type:text/event-stream)分隔,并且长度可以不同.

回应是

  • chunked(HTTP 1.1 Transfer-Encoding:chunked)由于源源不断
  • 压缩(Content-Encoding:gzip)以节省带宽.

我想尽快在Python中使用这些行,并尽可能节省资源,而不需要重新发明轮子.

由于我目前正在使用python-requests,你知道如何让它工作吗?如果您认为,python-requests在这里无法提供帮助,我对其他框架/库完全开放.

我当前的实现基于请求iter_lines(...)接收线路的用途.但chunk_size参数很棘手.如果设置1为非常强大,因为某些事件可能是几千字节.如果设置为大于1的任何值,则某些事件会一直停留到下一个到达并且整个缓冲区"已填满".事件之间的时间可能是几秒钟.我期望它chunk_size是某种"接收的最大字节数",就像在unix中一样recv(...).相应的手册页说:

接收呼叫通常会返回任何可用的数据,直到请求的数量,而不是等待收到所请求的全部金额.

但这显然不是它在请求库中的工作方式.他们或多或少地使用它作为"接收的确切字节数".在查看源代码时,我无法确定哪个部分对此负责.也许httplib的Response或ssl的SSLSocket.

作为一种解决方法,我尝试将服务器上的线路填充到块大小的倍数.但是,请求库中的块大小用于从压缩响应流中获取字节.所以这不会起作用,直到我可以填充我的行,使他们的压缩字节序列是块大小的倍数.但这似乎太过于苛刻了.

我已经读过Twisted可以用于客户端上的http流的非阻塞,非缓冲处理,但我只找到了在服务器上创建流响应的代码.

python http-streaming python-requests

8
推荐指数
2
解决办法
3575
查看次数