相关疑难解决方法(0)

在Golang中没有缓冲http.ResponseWritter

我正在Go中编写一个简单的Web应用程序,我希望将我的响应流式传输到客户端(即,在请求完全处理后,不会缓冲并以块的形式发送):

func handle(res http.ResponseWriter, req *http.Request) {
  fmt.Fprintf(res, "sending first line of data")
  sleep(10) //not real code
  fmt.Fprintf(res, "sending second line of data")
}
Run Code Online (Sandbox Code Playgroud)

从客户端的角度来看,这两行将同时发送.任何建议值得赞赏:)

@dystroy回答后编辑

在我亲自制作的每次写入后都可以刷新,但在我的用例中,这还不够:

cmd := exec.Command("a long command that outputs lots of lines")
cmd.Stdout = res //where res is a http.ResponseWritter
cmd.Stderr = res
err := cmd.Run()
Run Code Online (Sandbox Code Playgroud)

我希望我的输出cmd也被刷新.无论如何要"autoflush"ResponseWritter?

我在golang的邮件列表上找到了帮助.有两种方法可以实现这一点:使用允许接管HTTP的底层TCP连接的劫持程序,或者在写入和刷新的go例程中管道命令的stdout和stderr:

pipeReader, pipeWriter := io.Pipe()
cmd.Stdout = pipeWriter
cmd.Stderr = pipeWriter
go writeCmdOutput(res, pipeReader)
err := cmd.Run()
pipeWriter.Close()

//---------------------
func writeCmdOutput(res http.ResponseWriter, pipeReader …
Run Code Online (Sandbox Code Playgroud)

http flush stream go

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

JavaScript EventSource SSE未在浏览器中触发

我一直在开发一个nodejs服务器,为我在HTML5中开发的新网站提供服务器端事件.

当我telnet到服务器它正常工作,向我发送所需的HTTP响应标头,然后是我目前每2或3秒生成一次事件流,以证明它的工作原理.

我已经尝试了最新版本的FireFox,Chrome和Opera,他们创建了EventSource对象并连接到nodejs服务器,但是没有一个浏览器生成任何事件,包括onopen,onmessage和onerror.

但是,如果我停止我的nodejs服务器,终止与浏览器的连接,他们都会突然发送所有消息,并显示我的所有事件.然后浏览器都按照规范尝试重新连接到服务器.

我在网络服务器上托管所有内容.没有在本地文件中运行.

我已经阅读了我在网上找到的所有内容,包括我购买的书籍,没有任何迹象表明存在此类问题.我有什么遗失的东西吗?

示例服务器实现

  var http = require('http');
  var requests = [];

  var server = http.Server(function(req, res) {
    var clientIP = req.socket.remoteAddress;
    var clientPort = req.socket.remotePort;

    res.on('close', function() {
      console.log("client " + clientIP + ":" + clientPort + " died");

      for(var i=requests.length -1; i>=0; i--) {
        if ((requests[i].ip == clientIP) && (requests[i].port == clientPort)) {
          requests.splice(i, 1);
        }
      }
    });

    res.writeHead(200, {
      'Content-Type': 'text/event-stream', 
      'Access-Control-Allow-Origin': '*', 
      'Cache-Control': 'no-cache', 
      'Connection': 'keep-alive'});

    requests.push({ip:clientIP, port:clientPort, res:res});

    res.write(": connected.\n\n");
  });

  server.listen(8080); …
Run Code Online (Sandbox Code Playgroud)

javascript html5 node.js server-sent-events

22
推荐指数
1
解决办法
1万
查看次数

是否有真正的服务器推送http?

我知道有办法伪造它,轮询(或长轮询),但有没有办法让服务器联系浏览器推出信息?

轮询选项会浪费服务器上的资源,并且取决于服务器可以将其锁定(例如apache和iis).

似乎很多网站都使用长轮询来伪造服务器端推送机制而不是http.将一个真正的推送协议内置到浏览器中不是更好吗?

哪些选项对服务器友好,可以将(虚假或其他)信息推送到Web浏览器?

browser push http long-polling

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