繁体   English   中英

如何通过Yaws流式传输内容?

[英]How do I stream content with Yaws?

我读到有关Yaws的内容:将数据流传输到客户端 我创建了一个如下所示的简单示例,但是它不起作用。 我收到一个错误,过程即将结束。

这是我的偏航文件:

<erl>
out(A) ->
    Self = self(),  
    spawn(fun() ->
        yaws_api:stream_chunk_deliver_blocking(Self, "Hello"),
        yaws_api:stream_chunk_end(Self, "Thanks"),
        exit(normal)
    end),
    {streamcontent, "text/html; charset=utf-8", "First\r\n"}.
</erl>

我也尝试了yaws_api:stream_chunk_deliver/2但是遇到了同样的错误。 这是我在命令提示符下收到的错误消息:

=ERROR REPORT==== 13-Feb-2012::09:23:30 ===
Error in process <0.117.0> with exit value: {undef,[{yaws_api,stream_chunk_end,[
\n"],[]}]}"Thanks

1>
=ERROR REPORT==== 13-Feb-2012::09:24:00 ===
Yaws process died: {stream_timeout,
                       [{yaws_server,stream_loop_send,5,
                            [{file,"yaws_server.erl"},{line,2821}]},
                        {yaws_server,aloop,3,
                            [{file,"yaws_server.erl"},{line,1167}]},
                        {yaws_server,acceptor0,2,
                            [{file,"yaws_server.erl"},{line,1025}]},
                        {proc_lib,init_p_do_apply,3,
                            [{file,"proc_lib.erl"},{line,227}]}]}
1>

最后一块似乎没有发送给客户端:

HTTP/1.1 200 OK
Server: Yaws 1.92
Date: Mon, 13 Feb 2012 07:31:18 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked

7
First

7
Hello

这是我使用的JavaScript客户端代码(仅适用于IE8和IE9)以及XDomainRequest

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<script>
window.onload = function() {
    var el = document.getElementById("requestbutton");
    if(el.attachEvent) {
        el.attachEvent('onclick', doXDR);
    }
}

function writeStatus(message) {
    var html = document.createElement("div");
    html.setAttribute("class", "message");
    html.innerHTML = message;
    document.getElementById("status").appendChild(html);
}

function doXDR() {
    if(!window.XDomainRequest) {
        writeStatus("No XDR support in your browser");
        return;
    }

    writeStatus("Beginning XDR");
    try {
        var xdr = new XDomainRequest();
        xdr.open("GET", "http://localhost:8090/stream.yaws");
        xdr.send();
        xdr.onload = function() {
            writeStatus("XDR response: " + xdr.responseText);
        };
        xdr.onerror = function() {
            writeStatus("XDR error");
        };
        xdr.onprogress = function() {
            writeStatus("XDR intermediate: " + xdr.responseText);
        };
    } catch (e) {
        writeStatus("XDR Exception: " + e);
    }
}
</script>
</head>
<body>
<h1>Test page</h1>
<button id="requestbutton">Send request</button><br>
<div id="status"></div>
</body>
</html>

在JavaScript客户端上,将xdr.onerror = function()方法。 在此示例中,客户端不应显示任何数据,因为它需要2k的前奏 ,但应按照我的理解发送。


更新资料

解决了Steve Vinoski指出的Erlang问题并删除了我的数据\\r\\n ,Yaws服务器发送了正确的数据。 但是我在JavaScript客户端上仍然出现xdr.onerror = function()错误。 似乎我需要向响应Access-Control-Allow-Origin: *添加另一个标头Access-Control-Allow-Origin: *XDomainRequest对象中所述

该文档将通过发送带有标头值的标头来向域的服务器请求数据。 仅当服务器使用*或请求文档的确切URL的Access-Control-Allow-Origin标头响应时,它才会完成连接。 此行为是XDomainRequest对象与之集成的万维网联盟(W3C)的Web应用程序工作组的客户端跨域通信框架的一部分。

如何将此标头添加到HTTP响应中? 看来我只能在返回值中设置MIME类型: {streamcontent, MimeType, FirstChunk}

每当您看到undef错误时,就像您在上面显示的那样:

Error in process <0.117.0> with exit value: {undef,[{yaws_api,stream_chunk_end,

这意味着您正在调用不在加载路径上的模块中的函数,或者正在调用不存在的函数。 在您的代码中,您正在调用yaws_api:stream_chunK_end/2 ,该名称不存在。 您想要的是yaws_api:stream_chunk_end/1 将您的代码更改为以下内容:

<erl>
  out(A) ->
    Self = self(),  
      spawn(fun() ->
        yaws_api:stream_chunk_deliver_blocking(Self, "Hello\r\n"),
        yaws_api:stream_chunk_deliver_blocking(Self, "Thanks\r\n"),
        yaws_api:stream_chunk_end(Self),
        exit(normal)
      end),
    {streamcontent, "text/html; charset=utf-8", "First\r\n"}.
</erl>

然后我认为您的示例会很好。

更新:

为了回答问题的新部分,您可以使用列表返回值,而不仅仅是一个元组,请确保streamcontent元组在列表中位于最后:

[{header, {"Access-Control-Allow-Origin", "*"}},
 {streamcontent, "text/html; charset=utf-8", "First"}].

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM