Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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/3/flash/4.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
从Java到Web浏览器的SSE_Java_Http_Browser_Server Sent Events - Fatal编程技术网

从Java到Web浏览器的SSE

从Java到Web浏览器的SSE,java,http,browser,server-sent-events,Java,Http,Browser,Server Sent Events,我认为从Java发出HTTP SSE并处理这些连接不应该那么复杂,但我不知道如何做到这一点 我有一个服务器(JavaSE11)和多个客户端(带有JavaScript的Web浏览器),它们开始侦听来自服务器的消息。(我正在本地主机上测试) 客户端非常简单: var evtSource = new EventSource("localhost/javaapp"); evtSource.onmessage = function(e) { console.log("message: " + e.d

我认为从Java发出HTTP SSE并处理这些连接不应该那么复杂,但我不知道如何做到这一点

我有一个服务器(JavaSE11)和多个客户端(带有JavaScript的Web浏览器),它们开始侦听来自服务器的消息。(我正在本地主机上测试)

客户端非常简单:

var evtSource = new EventSource("localhost/javaapp");

evtSource.onmessage = function(e) {
  console.log("message: " + e.data);
}

evtSource.onerror = function(e) {
  console.log("sse failed");
}
但是对于服务器端,我不知道。经过一些调查,我发现我可能应该使用API,但它所拥有的只是接口,您发现的示例代码片段使用了大量@Annotation,这是我希望避免的

我需要这个API吗?或者我可以用适当的头创建一个基本的HTTP连接吗?那么,如何实现SSE的所有功能呢?自动保持活动等

目的是分别处理所有客户。他们订阅服务器,如果某个服务器发生事件,服务器将向该服务器发送消息。因此,这不是向所有人广播相同的内容。

使用SpringWeb 您可以简单地创建一个对象,然后向其发送数据

您可以按原样从客户处接收数据


@Controller
@RequestMapping(path = "api/person")
public class PersonController {

    @Autowired
    private PersonRepository personRepository;
    private Optional<SseEmitter> sseEmitter = Optional.empty();

    @PostMapping(path = "/add")
    public @ResponseBody
    String addPerson(@RequestBody Person person) {
        personRepository.save(person);
        sseEmitter.ifPresent(sseEmitter1 -> {
                    try {
                        sseEmitter1.send(person);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
        );
        return "Saved";
    }

    @GetMapping(path = "/onPersonAdded")
    public SseEmitter onPersonAdded() {
        sseEmitter = Optional.of(sseEmitter.orElse(new SseEmitter(-1L)));
        return sseEmitter.get();
    }
}

@控制器
@请求映射(path=“api/person”)
公共类个人控制器{
@自动连线
个人知识库;
private-Optional-sseEmitter=Optional.empty();
@后期映射(路径=“/add”)
公共@ResponseBody
字符串addPerson(@RequestBody-Person){
personRepository.save(person);
SSemitter.ifPresent(SSemitter1->{
试一试{
sseEmitter1.发送(人);
}捕获(IOE异常){
e、 printStackTrace();
}
}
);
返回“已保存”;
}
@GetMapping(path=“/onPersonAdded”)
公共SSEONpersonAdded(){
sseEmitter=可选的.of(sseEmitter.orElse(新的sseEmitter(-1L));
返回sseEmitter.get();
}
}

您可能需要为其提供一个现有的框架/服务器API。并不像“只设置标题”那么简单。正如您所注意到的,Jaxrs具有这个特性,并且工作得非常好。如果你只是想测试和玩,你也可以检查我的项目上。可以使用三行代码创建SSE端点