【HTML5】浅析html使用SSE(Server-Sent Events)连接JSP

一,关于SSE的一些话

    ①什么是SSE

                SSE(Server-Sent Events)是一个能让浏览器通过HTTP协议自动获取服务器端更新的技术。这种技术封装在 SSE EventSource API里,打开链接可以阅读。SSE EventSource API 被W3C制定为HTML5的一部分。

    ②SSE的浏览支持情况

                目前主流的浏览器都支持,除了IE。

Browser Supported Notes
Internet Explorer No IE not supported
Mozilla Firefox(火狐) Yes version 6.0
Google Chrome(谷歌) Yes GC is supported
Opera(欧朋) Yes version 11
Safari(游猎) Yes version 5.0

    ③SSE的工作机制

                我几乎没在网上看到有人提过这一点,这里仅仅是我的理解。当一个使用了SSE的HTML页面发布并且在支持的浏览器端载入成功后。那么带有SSE的页面就会让浏览器建立一种访问机制——在规定的间隔时间不停地访问SSE指定服务器中的数据,如果服务器端数据有更新则获取并输出到当前的html5页面上,这个过程会存在延迟存在,延迟时间会和服务器类型、数据大小、浏览器支持情况等有关。                 下面这张图片是我使用SSE连接jsp成功后,再关闭服务器出现的情况,读者也可以自己试,会发现这些错误出现是有间隔时间的,这就是延迟,自己的大概3秒。 【HTML5】浅析html使用SSE(Server-Sent Events)连接JSP_第1张图片


二,使用SSE连接JSP文件

    ①HTML页面

                这个文件的MIME类型要设置为text/heml,它是被浏览器响应的。测试当前浏览器是否支持SSE:

if(typeof(EventSource)!=="undefined")
{
    alert("Support");
}
else
{
    alert("Not Support");
}

                EventSource对象用于接受服务器端发送事件通知,每当source接受到来着sseserver页面的更新消息,就会触发onmessage事件,然后会将数据推入id为”result”的元素中。除了onmessage事件,EventSource对象还有onerror和onopen。

事件 描述
onopen 当通往服务器的连接被打开
onmessage 当接收到消息
onerror 当发生错误
 var source=new EventSource("sseserver.jsp");
    source.onmessage=function(event)
    {
        document.getElementById("result").innerHTML += event.data + "
"
; };

                客户端完整代码:


<html>
  <head>
    <title>SSEtitle>

    <meta name="keywords" content="keyword1,keyword2,keyword3">
    <meta name="description" content="this is my page">
    <meta name="content-type" content="text/html; charset=UTF-8">

    

  head>
<body>
<h1>get datah1>
<div id="result">div>
<div id = "err">div>

<script>
if(typeof(EventSource)!=="undefined")
{
    var source=new EventSource("sseserver.jsp");
    source.onmessage=function(event)
    {
        document.getElementById("result").innerHTML += event.data + "
"
; }; } else { document.getElementById("result").innerHTML="not support SSE"; }
script> body> html>

    ②服务器端

                网上的教程大部分都是使用php和Asp,这里自己使用JSP,原理都是一样,在使用之前都必须将MIME类型设置为“text/event-stream”。

 response.setContentType("text/event-stream");

                这行代码需要放在所有的前面,不然会报出错误:“EventSource’s response has a MIME type (“text/html”) that is not “text/event-stream”. Aborting the connection.”。 有兴趣的读者可以试一试在添加这行代码:

<meta name="content-type" content="text/event-stream">

                笔者在Chrome上测试过,它对SSE不会产生任何作用。服务器端完整代码:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>


<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP 'sseserver.jsp' starting pagetitle>
     <%
    response.setContentType("text/event-stream");
     %>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="-1">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">


    
  head>

  <body>
  <%
  Date date = new Date();//create time Object
  out.println("data:"+date.toString());
  out.flush();
  %>
  body>
html>


三,错误

    错误一

                错误描述:EventSource的响应有一个MIME类型(“text/html”),不是“text/source”。中止连接。                 错误代码:“EventSource’s response has a MIME type (“text/html”) that is not “text/event-stream”. Aborting the connection.”                 错误处理:很明显需要设置一个MIME类型。当你设置了“text/stream”后,还是报出这个错误,那么可能是你设置的位置不正确。当出现错误后大部分应该是调出JSP的源码,会发现有一行代码是“ response.setContentType(“text/html;charset=utf-8”);” 【HTML5】浅析html使用SSE(Server-Sent Events)连接JSP_第2张图片需要修改的就是这里的“text/html”,笔者认为这里的Content-type是一个默认值,如果需要用户是可以在后面重新设置的

    response.setContentType("text/event-stream");

    错误二

                错误描述:“EventSource的响应编码是gb2312不是utf-8,终止连接。”                 错误代码:EventSource’s response has a charset (“gb2312”) that is not UTF-8. Aborting the connection. 错误处理:确保html编码

<meta name="content-type" content="text/html; charset=UTF-8">

和JSP编码

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

一致即可。

    错误三

                错误描述:无法找到目的文件                 错误代码:GET ……… net::ERR_CONNECTION_REFUSED                 错误处理:检查文件布置、书写是否有误。

    错误四

                错误描述:无法设置未定义的选择器                 错误代码:Cannot set property ‘selector’ of undefined
                                 [LivePreview] Error executing a handler for Runtime.evaluate                 错误处理:如果你打开一个原始的Html页面(无SSE的),会发现都有这样的错误。如果你的SSE无法工作,而Chrome中只有这个错误,那么可能是下面的错误五引起的。 【HTML5】浅析html使用SSE(Server-Sent Events)连接JSP_第3张图片

    错误五

                错误描述:在Chrome中按F12,在控制台中未发现任何错误,但是SSE不能工作。                 错误代码:无                 错误解决:这个问题让人挺蛋疼的,自己遇上的时候琢磨了好久,后来认为是onmessage没有工作,然后又在网上找了找,关于这样的文章不多。我找到一篇Blog给出了“偏方”, 点击查看偏方。不过他的方法不适合我。我的偏方是这样的:

  <%
  Date date = new Date();//create time Object
  out.println("2");
  out.println("data:"+date.toString());
  out.flush();
  %>

这样就可以正常显示数据了。有时候event不能显示字符串,我认为是EventSource的工作机制造成的。

你可能感兴趣的:(HTML5)