服务器主动通知网页客户端,服务器向客户端网页实时推送数据例子

【实例简介】需要先还原相关 nuget包,然后再使用,具体方法是:右键解决方案>>管理nuget包>>打开后 点击还原缺少的包即可

【实例截图】

d1e5c84362a39efc8a50db55d99f1261.png

【核心代码】

using System;

using System.Collections.Concurrent;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Net;

using System.Net.Http;

using System.Net.Http.Headers;

using System.Threading;

using System.Web;

using System.Web.Http;

using ServerSentEvent4Net;

namespace ServerSentEventsTest.Controllers

{

public class SSEController : ApiController

{

private static readonly Lazy _timer = new Lazy(() => new Timer(TimerCallback, null, 0, 1000));

private static readonly Lazy> SSE = new Lazy>(() =>

{

var sse = new ServerSentEvent(10, true, 5000);

sse.SubscriberAdded = SSE_SubscriberChanged;

sse.SubscriberRemoved = SSE_SubscriberChanged;

return sse;

});

static void SSE_SubscriberChanged(object sender, SubscriberEventArgs e)

{

ClientsController.Send(e.SubscriberCount.ToString());

}

public HttpResponseMessage Get(HttpRequestMessage request)

{

Timer t = _timer.Value;

return SSE.Value.AddSubscriber(request, new InfoAboutSubscriber("both"));

}

public HttpResponseMessage Get(string filter)

{

Timer t = _timer.Value;

return SSE.Value.AddSubscriber(this.Request, new InfoAboutSubscriber(filter));

}

private static void TimerCallback(object state)

{

Random randNum = new Random();

int num = randNum.Next(30, 100);

SSE.Value.Send(num.ToString(), info =>

{

if (info != null)

{

bool isOdd = (num % 2) == 1;

switch (info.Filter)

{

case InfoAboutSubscriber.MessageFilter.Both:

return true;

case InfoAboutSubscriber.MessageFilter.Odd:

return isOdd;

case InfoAboutSubscriber.MessageFilter.Even:

return !isOdd;

}

}

return false;

});

//To set timer with random interval

_timer.Value.Change(TimeSpan.FromMilliseconds(randNum.Next(1, 3) * 500), TimeSpan.FromMilliseconds(-1));

}

private class InfoAboutSubscriber

{

public enum MessageFilter

{

Both, Odd, Even

}

public InfoAboutSubscriber(string filter)

{

if (String.Compare(filter, "odd", true) == 0)

this.Filter = MessageFilter.Odd;

else if(String.Compare(filter, "even", true) == 0)

this.Filter = MessageFilter.Even;

else

this.Filter = MessageFilter.Both;

}

public MessageFilter Filter { get; private set; }

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值