gpt4 book ai didi

JavaScript EventSource SSE 未在浏览器中触发

转载 作者:IT老高 更新时间:2023-10-28 22:05:26 28 4
gpt4 key购买 nike

我一直在开发一个 nodejs 服务器来为我正在用 HTML5 开发的新网站提供服务器端事件。

当我 telnet 到服务器时,它正常工作,向我发送所需的 HTTP 响应 header ,然后是我目前每 2 或 3 秒生成的事件流,以证明它有效。

我已经尝试了最新版本的 FireFox、Chrome 和 Opera,它们创建了 EventSource 对象并连接到 nodejs 服务器 OK,但是没有一个浏览器生成任何事件,包括 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);

setInterval(function test() {
broadcast('poll', "test message");
}, 2000);

function broadcast(rtype, msg) {
var lines = msg.split("\n");

for(var i=requests.length -1; i>=0; i--) {
requests[i].res.write("event: " + rtype + "\n");
for(var j=0; j<lines.length; j++) {
if (lines[j]) {
requests[i].res.write("data: " + lines[j] + "\n");
}
}
requests[i].res.write("\n");
}
}

一个示例 html 页面

<!DOCTYPE html>
<html>
<head>
<title>SSE Test</title>
<meta charset="utf-8" />
<script language="JavaScript">
function init() {
if(typeof(EventSource)!=="undefined") {
var log = document.getElementById('log');
if (log) {
log.innerHTML = "EventSource() testing begins..<br>";
}

var svrEvents = new EventSource('/sse');

svrEvents.onopen = function() {
connectionOpen(true);
}

svrEvents.onerror = function() {
connectionOpen(false);
}

svrEvents.addEventListener('poll', displayPoll, false); // display multi choice and send back answer

svrEvents.onmessage = function(event) {
var log = document.getElementById('log');
if (log) {
log.innerHTML += 'message: ' + event.data + "<br>";
}
// absorb any other messages
}
} else {
var log = document.getElementById('log');
if (log) {
log.innerHTML = "EventSource() not supported<br>";
}
}
}

function connectionOpen(status) {
var log = document.getElementById('log');
if (log) {
log.innerHTML += 'connected: ' + status + "<br>";
}
}

function displayPoll(event) {
var html = event.data;
var log = document.getElementById('log');
if (log) {
log.innerHTML += 'poll: ' + html + "<br>";
}
}
</script>
</head>
<body onLoad="init()">
<div id="log">testing...</div>
</body>
</html>

这些示例是基本的,但与我在书本和网上看到的所有其他演示相同。 eventSource 似乎只有在我结束客户端连接或终止服务器时才有效,但这将是轮询而不是 SSE,我特别想使用 SSE。

有趣的是,演示,例如来自 html5rock 的 thouse当我在线使用它们时,它们似乎也没有像预期的那样工作..

最佳答案

破解了! :)

感谢 Tom Kersten 的帮助谁帮助我进行测试。原来代码不是问题。

请注意.. 如果您的客户端使用任何类型的防病毒软件来拦截 Web 请求,则可能会在此处引起问题。在这种情况下,提供企业级防病毒和防火墙保护的 Sophos Endpoint Security 具有称为 Web 保护的功能。此功能中有一个扫描下载的选项;似乎 SSE 连接被视为下载,因此在连接关闭并接收到要扫描的流之前不会释放到浏览器。禁用此选项可以解决问题。我已提交错误报告,但其他防病毒系统可能会这样做。

感谢您的建议并帮助大家:)

关于JavaScript EventSource SSE 未在浏览器中触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12978466/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com