Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用Javalin使客户端接收服务器发送的事件?_Javascript_Java_Server Sent Events_Javalin - Fatal编程技术网

Javascript 如何使用Javalin使客户端接收服务器发送的事件?

Javascript 如何使用Javalin使客户端接收服务器发送的事件?,javascript,java,server-sent-events,javalin,Javascript,Java,Server Sent Events,Javalin,我正在尝试实现一个服务器-客户机项目,该项目需要服务器每5分钟向客户机发送一次数据,客户机只在连接开始时发出请求。服务器发送的事件似乎是解决方案 我尝试过使用Javalin文档中给出的函数。我能够通过简单的get从服务器接收响应。但我无法建立sse连接。代码在服务器中输入lambda函数,但客户端没有接收任何内容。我不确定客户机或服务器,甚至两者都有问题。 我们从下面的代码中得到的唯一输出是服务器端的“已连接”。先谢谢你 服务器的代码 import io.javalin.Javalin; pu

我正在尝试实现一个服务器-客户机项目,该项目需要服务器每5分钟向客户机发送一次数据,客户机只在连接开始时发出请求。服务器发送的事件似乎是解决方案

我尝试过使用Javalin文档中给出的函数。我能够通过简单的get从服务器接收响应。但我无法建立sse连接。代码在服务器中输入lambda函数,但客户端没有接收任何内容。我不确定客户机或服务器,甚至两者都有问题。 我们从下面的代码中得到的唯一输出是服务器端的“已连接”。先谢谢你

服务器的代码

import io.javalin.Javalin;

public class SimpleTwitter {

  public static void main(String[] args) {

    Javalin app = Javalin.create().start(7000);

    app.sse("/sse", client ->{
        System.out.println("connected");
        client.sendEvent("message","Hello, SSE");
        client.onClose(() -> System.out.println("Client disconnected"));
    });

    app.get("/", ctx -> ctx.result("Hello World"));

   }
}
客户端的代码

<!DOCTYPE html>
<html>
<body>

<h1>Getting server updates</h1>
<div id="result"></div>

<script>
if(typeof(EventSource) !== "undefined") {
  var source = new EventSource("http://localhost:7000/sse");
  source.onmessage = function(event) {
    document.getElementById("result").innerHTML += event.data + "<br>";
  };
} else {
  document.getElementById("result").innerHTML = "Sorry, your browser does not support server-sent events...";
}
</script>

</body>
</html>

获取服务器更新
if(typeof(EventSource)!=“未定义”){
变量源=新事件源(“http://localhost:7000/sse");
source.onmessage=函数(事件){
document.getElementById(“结果”).innerHTML+=event.data+“
”; }; }否则{ document.getElementById(“结果”).innerHTML=“对不起,您的浏览器不支持服务器发送的事件…”; }
原来问题不在于代码。通过查看chrome上的开发者工具,我们看到了以下内容:

从源“null”访问“”处的资源 已被CORS策略阻止:无“访问控制允许来源” 请求的资源上存在标头。“

当我们安装了一个名为“Allow-Control-Allow-Origin:*”的chrome扩展时,我们能够看到输出

此外,以下是更新的更好的工作代码:

> <<!DOCTYPE html> <html> <body>
> 
> <h1>Tweets</h1>
> 
> <script> new
> EventSource('http://localhost:7000/sse').addEventListener( "hi", msg
> =>{       document.write(msg.data); }); </script>
> 
> </body> </html>
>
>推特
> 
>新的
>事件源('http://localhost:7000/sse)。addEventListener(“嗨”,msg
>=>{document.write(msg.data);};
> 
>  

publicstaticvoidmain(String[]args)抛出InterruptedException{
队列客户端=新的ConcurrentLinkedQueue();
Javalin app=Javalin.create().start(7000);
app.sse(“/sse”,客户端->{
客户。添加(客户);
client.onClose(()->clients.remove(client));
});
while(true){
用于(SseClient客户端:客户端){
client.sendEvent(“你好”、“你好世界”);
}
时间单位。秒。睡眠(1);
}
}
public static void main(String[] args) throws InterruptedException {

        Queue<SseClient> clients = new ConcurrentLinkedQueue<>();

        Javalin app = Javalin.create().start(7000);
                app.sse("/sse", client -> {
            clients.add(client);
            client.onClose(() -> clients.remove(client));
        });

        while (true) {
            for (SseClient client : clients) {
                client.sendEvent("hi", "hello world");
            }
            TimeUnit.SECONDS.sleep(1);
        }

    }