目录结构:

//

contents structure [-]

一,关于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秒。

二,使用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 + "<br>";
    };

客户端完整代码:

<!DOCTYPE html>
<html>
  <head>
    <title>SSE</title>

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

    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

  </head>
<body>
<h1>get data</h1>
<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 + "<br>";
    };
}
else
{
    document.getElementById("result").innerHTML="not support SSE";
}
</script>

</body>
</html>

②服务器端

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

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

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

<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+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP 'sseserver.jsp' starting page</title>
     <%
    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">

    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </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”);”
 
需要修改的就是这里的“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中只有这个错误,那么可能是下面的错误五引起的。

错误五

错误描述:在Chrome中按F12,在控制台中未发现任何错误,但是SSE不能工作。

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

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

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

四,参考文章

http://blog.csdn.net/u011627980/article/details/51362799?locationNum=7&fps=1    

【HTML5】浅析html使用SSE(Server-Sent Events)连接JSP的更多相关文章

  1. Play Framework, Server Sent Events and Internet Explorer

    http://www.tuicool.com/articles/7jmE7r Next week I will be presenting at Scala Days . In my talk I w ...

  2. server sent events

    server sent events server push https://html5doctor.com/server-sent-events/ https://developer.mozilla ...

  3. win7中 SQL server 2005无法连接到服务器,错误码:18456

    win7中 SQL server 2005无法连接到服务器,错误码:18456.. 数据库刚装完.我用Windows登陆  结果登陆不上去.. 选中SQL Server Management Stud ...

  4. 处于同一个域中的两台Sql server 实例无法连接

    处于同一个域中的两台Sql server 实例无法连接,报的错误信息如下: A network-related or instance-specific error occurred while es ...

  5. 本地数据库(SQL Server)远程连接服务器端服务器

    本地数据库(SQL Server 2012) 连接外网服务器的数据库,外网的服务器端需要做如下配置: 1. 首先是要打开 数据的配置管理工具 2. 配置相关的客户端协议,开启TCP/IP 3. 数据库 ...

  6. SQL Server中内连接和外连接的区别

    SQL Server中内连接和外连接的区别 假设一个数据库中有两张表,一张是学生表StudentInfo,一张是班级表ClassInfo,两张表之间用ClassId字段进行关联. 如果用内连接,正常的 ...

  7. 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接

    由于项目中必须得用JDK6来作为Java环境,于是连接SQLServer时出现了com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安 ...

  8. SQL Server管理员专用连接的使用

    原文:SQL Server管理员专用连接的使用 作为一名DBA,经常会处理一些比较棘手的服务无响应问题,鉴于事态的严重性,多数DBA可能直接用“重启”大法,以便尽快的恢复生产环境的正常运转,但是多数情 ...

  9. SQL Server "允许远程连接到此服务器" 配置

    在SQL Server的属性-->连接中我们可以看到这样一个选项:'允许远程连接到此服务器'(英文是remote access),其默认值是1,表示此选项开启. 但是这个参数并非是字面上所显示的 ...

随机推荐

  1. Request.UrlReferrer 使用

    最近有一个功能是反馈统计,然后在反馈建议里面添加是从哪个页面点击过来的,一开始打算做成&url=这种方法加在链接里面然后页面接受参数,后来知道了request.UrlReferrer 知道他可 ...

  2. [转载]TFS源代码管理

    以下主要描述了: TFS源代码控制系统的基本场景 如何把一个项目添加到源代码管理中 如何与服务器同步 如何做Check-In 如何做分支与合并 什么是上架与下架 我们知道工作项是项目管理的基本元素,但 ...

  3. 推荐几款制作网页滚动动画的 JavaScript 库

    这里集合了几款很棒的制作网页滚动动画的 JavaScript 库和插件.它们中,有的可以帮助你在页面滚动的时候添加动感的元素动画,有的则是实现目前非常流行的全屏页面切换动画.相信借助这些插件,你也可以 ...

  4. MySQL修改默认字符集

    今天朋友在做某个程序项目时,需要修改MySQL修改默认字符集,搞不好找我帮忙.百度了试了好几篇博文中的方法,最后终于成功了.但是感觉那些博文思路有点乱,所以自己总结下,希望可以帮到遇到同样问题的人. ...

  5. java线程(1)--概念基础

    参考:http://lavasoft.blog.51cto.com/62575/99150 http://blog.csdn.net/baby_newstar/article/details/6783 ...

  6. Linux安装配置tomcat

    1.首先配置好jdk 查看java版本:java -verson 1.官网下载jdk 2.tar -zxvf xxxx.tar.gz   解压 3.配置环境变量 <1># vi /etc/ ...

  7. C# Socket系列二 简单的创建 socket 通信

    看了系列一 我们开启了对socket tcp的监听状态,那么这一章我们来讲解怎么创建socket的通信代码 我新建一个类 TSocketBase public abstract class TSock ...

  8. 这些HTML、CSS知识点,面试和平时开发都需要 No10-No11

    系列知识点汇总 1.基础篇 这些HTML.CSS知识点,面试和平时开发都需要 No1-No4(知识点:HTML.CSS.盒子模型.内容布局) 这些HTML.CSS知识点,面试和平时开发都需要 No5- ...

  9. 做一个会PS切图的前端开发

    系列链接 做一个会使用PS的前端开发 做一个会PS切图的前端开发 切图方法分类 PhotoShop从CS版本演变到现在的CC版本,切图功能发生了比较大的变化,我们可以把PhotoShop CS版本时的 ...

  10. ASP.NET MVC系列:开始

    创建Asp.Net MVC项目 从visual studio主界面开始菜单中点击“新建项目”