嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元微信扫码支付:2 元
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
亲测通过,可以实时将消息发送至客户端,几乎零延时。。。,很快
不像ajax一样,一直刷。。。
最近在项目开发中使用了一种比较新的技术,SSE,即 Server-Send Event,使用它从服务器向浏览器推送数据。
传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“通知”,这要比浏览器按时向服务器查询(polling)更有效率。
服务器发送事件(Server-Sent Events,简称SSE)就是为了解决这个问题,而提出的一种新API,部署在EventSource对象上。目前,除了IE,其他主流浏览器都支持。
简单说,所谓SSE,就是浏览器向服务器发送一个HTTP请求,然后服务器不断单向地向浏览器推送“信息”(message)。这种信息在格式上很简单,就是“信息”加上前缀“data: ”,然后以“\n\n”结尾。
SSE与WebSocket有相似功能,都是用来建立浏览器与服务器之间的通信渠道。两者的区别在于:
WebSocket是全双工通道,可以双向通信,功能更强;SSE是单向通道,只能服务器向浏览器端发送。
WebSocket是一个新的协议,需要服务器端支持;SSE则是部署在HTTP协议之上的,现有的服务器软件都支持。
SSE是一个轻量级协议,相对简单;WebSocket是一种较重的协议,相对复杂。
SSE默认支持断线重连,WebSocket则需要额外部署。
SSE支持自定义发送的数据类型。
从上面的比较可以看出,两者各有特点,适合不同的场合。
提示:除了IE之外,几乎所有浏览器均支持 SSE
SSE浏览器 兼容性如下:
using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Web.Http; using System.IO; using System.Net.Http.Headers; using System.Net; using System.Collections.Concurrent; using System.Threading; using Newtonsoft.Json; using System.Diagnostics; using System.Threading.Tasks; using Strathweb.HTML5push.Models; namespace Strathweb.HTML5push.Controllers { //如果想 每个聊天室 都独立显示聊天内容的话,则需要将 _streammessage 按照聊天室编号 存储到 dictionary中 public class ChatController : ApiController { private static readonly ConcurrentQueue<StreamWriter> _streammessage = new ConcurrentQueue<StreamWriter>(); public HttpResponseMessage Get(HttpRequestMessage request) { HttpResponseMessage response = request.CreateResponse(); response.Content = new PushStreamContent(OnStreamAvailable, "text/event-stream"); return response; } public void Post(Message m) { m.dt = DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss"); MessageCallback(m); } public static void OnStreamAvailable(Stream stream, HttpContentHeaders headers, TransportContext context) { StreamWriter streamwriter = new StreamWriter(stream){ AutoFlush = true }; streamwriter.WriteLine("data:init \n"); streamwriter.WriteLine(""); streamwriter.Flush(); _streammessage.Enqueue(streamwriter); } private static void MessageCallback(Message m) { var i = 0; foreach (var subscriber in _streammessage) { i ; try { subscriber.WriteLine("data:" JsonConvert.SerializeObject(m) "\n"); subscriber.WriteLine(""); subscriber.Flush(); } catch (Exception ex) { var j = i; } } } } //下为异步方式(也亲测通过了),需更改项目属性为 .net framework 4.5 //public class ChatController : ApiController //{ // private static object locker = new object(); // private static readonly List<StreamWriter> Subscribers = new List<StreamWriter>(); // public HttpResponseMessage Get(HttpRequestMessage request) // { // var response = new HttpResponseMessage // { // Content = new PushStreamContent(async (respStream, content, context) => // { // var subscriber = new StreamWriter(respStream) // { // AutoFlush = true // }; // lock (locker) // { // Subscribers.Add(subscriber); // } // await subscriber.WriteLineAsync("data: \n"); // }, "text/event-stream") // }; // return response; // } // public async Task Post(Message m) // { // m.dt = DateTime.Now.ToShortDateString(); // await MessageCallback(m); // } // private static async Task MessageCallback(Message m) // { // for (var i = Subscribers.Count - 1; i >= 0; i--) // { // try // { // await Subscribers[i].WriteLineAsync("data:" JsonConvert.SerializeObject(m) "\n"); // await Subscribers[i].WriteLineAsync(""); // await Subscribers[i].FlushAsync(); // } // catch (Exception) // { // lock (locker) // { // Subscribers.RemoveAt(i); // } // } // } // } //} }