首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用SSE进行onmessage (Java Servlet + ES6 JS)

无法使用SSE进行onmessage (Java Servlet + ES6 JS)
EN

Stack Overflow用户
提问于 2018-05-16 09:44:21
回答 1查看 89关注 0票数 0

我试着做一个SSE的例子,就像在这个视频https://www.youtube.com/watch?v=rhCKCKD0KnA中一样

代码语言:javascript
复制
    response.setContentType("text/event-stream");
    response.setCharacterEncoding("UTF-8");

    PrintWriter printWriter = null;

    while(true) {

        try {
            double rnd = Math.random() * 10000;

            printWriter = response.getWriter();
            printWriter.print("Rnd: " + rnd);

            response.flushBuffer();


            Thread.sleep(5000);

        }
        catch(IOException | InterruptedException e) {
            e.printStackTrace();

            printWriter.close();

            break;
        }


    }

和客户端

代码语言:javascript
复制
    window.onload = function () {

        startButton.onclick = () => {
            eventSource = new EventSource('http://localhost:8080/byteslounge-1/sse_test');

            eventSource.onopen = () => {
                displayTextArea.value += 'connected...' + '\n';
            };

            eventSource.onmessage = (message) => {
                displayTextArea.value += message.data + '\n\n';
            };

            eventSource.onerror = () => {
                displayTextArea.value += 'error occured...' + '\n';
            };

            startButton.disabled = true;
        };

        takeMsg.onclick = () => {
            eventSource.onmessage = (message) => {
                displayTextArea.value += message.data + '\n\n';
            };
        };

        stopButton.onclick = () => {
            eventSource.close();
            startButton.disabled = false;
        };

        clearText.onclick = () => {
            displayTextArea.value = '';
        }

    }

连接正常,但无法接收onMessage中的任何数据。服务器/客户端上没有错误/警告。我使用的是FF 64位最新版本/JDK 1.8/Payara。

EN

回答 1

Stack Overflow用户

发布于 2018-05-18 03:51:22

我在你的代码中看不到任何明显的问题。但是,在使用Payara 5时,我建议使用JAX-RS SSE API,而不是自己在servlet中编码。

请参阅此处的示例和指南:http://ridingthecrest.com/blog/2017/02/22/jax-rs-2_1-new-feature-introduction.html

使用JAX-RS SSE的服务器端点的替代方案:

代码语言:javascript
复制
@Path("server-sent-events")
@Singleton
public class ServerSentEventsResource {

    @GET
    @Produces(MediaType.SERVER_SENT_EVENTS)
    public void getMessageQueue(@Context SseEventSink eventSink, @Context Sse sse) {

      while(true) {

        try {
            double rnd = Math.random() * 10000;

            eventSink.send(sse.newEvent("custom-message"));

            Thread.sleep(5000);

        }
        catch(IOException | InterruptedException e) {
            e.printStackTrace();

            printWriter.close();

            break;
        }
      }
    }
}

还要使用通用SSE客户端测试服务器端点,例如,curl支持SSE,并在传入事件到来时打印它们。如果这是有效的,那么你的javascript客户端就会出错。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50361318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档