C#下如何实现Server-Sent Event(SSE)

 更新时间:2025年07月09日 08:46:26   作者:Ping通途说 (doupoa.site)  
用户因缺乏C#实现SSE服务的参考资料,自行采用HttpListener库搭建服务端,基于协议实现非稳定性数据传输,并附代码注释分享经验,供开发者参考

1.引言

最近有个C#项目需要实现SSE服务,但在网上找了一圈都没有相关的文章,那就只能根据服务的协议自己写了。

在这里分享下,希望能帮助有需要的开发者。

2.功能实现

项目要求不高,不要求每次传输的数据必达客户端,即不追求稳定性,因此在功能实现上我使用HttpListener库作为功能的服务端。

相关协议内容请自行参照EventSource - Web API 接口参考 | MDN (mozilla.org)

各浏览器的支持情况:

新建一个类,包含以下代码,代码大部分都写了注释:

class SSEServer {
    private static HttpListener listener;

    public bool Start() {
        try {
            listener = new HttpListener();
            listener.Prefixes.Add($ "http://+:{Properties.Settings.Default.ServerPort}/");  // 监听配置文件中的IP地址,必须以`/`结尾
            listener.Start();
            listener.BeginGetContext(GetContentCallBack, listener); //当创建连接后响应的函数
        } catch (Exception ex) {
            MessageBox.Show("创建服务异常,请检查端口是否被占用:\n" + ex);
            return false;
        }
        return true;
    }

    public void Stop() {
        if (listener.IsListening) {
            listener.Stop();
        }
    }

    private void GetContentCallBack(IAsyncResult ar) {

        HttpListener _listener = ar.AsyncState as HttpListener; //异步服务,避免阻塞,也能接收多条连接
        if (_listener.IsListening) {
            HttpListenerContext context = _listener.EndGetContext(ar);
            _listener.BeginGetContext(new AsyncCallback(GetContentCallBack), _listener); // 创建新线程监听其他请求

            HttpListenerRequest req = context.Request; //获取连接请求体
            if (req.HttpMethod == "GET") //SSE只接受GET请求
            {
                HttpListenerResponse response = context.Response; //获取连接响应体
                response.StatusCode = (int) HttpStatusCode.OK; //设定状态码
                response.ContentType = "text/event-stream;charset=UTF-8"; //设定SSE的响应头
                response.AddHeader("Cache-Control", "no-cache");
                response.AddHeader("Connection", "keep-alive");
                response.AddHeader("Access-Control-Allow-Origin", "*");
                response.AddHeader("Transfer-Encoding", "chunked");
                response.ContentEncoding = Encoding.UTF8; //各种各样的响应头
                using(var stream = response.OutputStream) { //创建响应体自带的缓存流
                    while (true) {
                        try {
                            var data = Encoding.UTF8.GetBytes($ "Event: message\ndata: Hello World!\n\n"); //必须以UTF8编码发送数据
                            stream.Write(data, 0, data.Length);
                            Thread.Sleep(1000); //一秒发送一次数据
                        } catch { //有问题直接catch
                                }));
                            }
                            _listener.Close(); //关闭当前线程的连接
                            break; //当前连接响应函数运行完毕
                        }
                    }
                }
            }
        }
    }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C#实现的JS操作类实例

    C#实现的JS操作类实例

    这篇文章主要介绍了C#实现的JS操作类,封装了C#关于javascript的弹出对话框、返回上一页、跳转等常用操作,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • C#实现自定义ListBox背景的示例详解

    C#实现自定义ListBox背景的示例详解

    这篇文章主要为大家详细介绍了如何利用C#实现自定义ListBox背景,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • c#几种数据库的大数据批量插入(SqlServer、Oracle、SQLite和MySql)

    c#几种数据库的大数据批量插入(SqlServer、Oracle、SQLite和MySql)

    这篇文章主要介绍了c#几种数据库的大数据批量插入(SqlServer、Oracle、SQLite和MySql),需要的朋友可以了解一下。
    2016-11-11
  • C#利用雪花算法实现生成ID工具类

    C#利用雪花算法实现生成ID工具类

    雪花算法表示生成的ID如雪花般独一无二,该算法源自Twitter,主要用于解决分布式系统的唯一Id生成问题,本文主要介绍了C#如何利用利用雪花算法实现生成ID,需要的可以参考下
    2023-12-12
  • C#如何对Dictionary遍历赋值

    C#如何对Dictionary遍历赋值

    这篇文章主要介绍了C#如何对Dictionary遍历赋值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • C#实现简单的五子棋游戏

    C#实现简单的五子棋游戏

    这篇文章主要为大家详细介绍了C#实现简单的五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • C#实现的简单验证码识别实例

    C#实现的简单验证码识别实例

    这篇文章主要介绍了C#实现的简单验证码识别实例,只适应一些简单的验证码,需要的朋友可以参考下
    2014-06-06
  • C# 静态构造函数使用总结

    C# 静态构造函数使用总结

    今天花了一些时间把静态构造函数的用法总结了一下,希望高手们指点。谢谢
    2013-03-03
  • C# 基于消息发布订阅模型的示例(上)

    C# 基于消息发布订阅模型的示例(上)

    这篇文章主要介绍了C# 基于消息发布订阅模型的示例,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-03-03
  • C#列出当前系统所有正在运行程序的方法

    C#列出当前系统所有正在运行程序的方法

    这篇文章主要介绍了C#列出当前系统所有正在运行程序的方法,涉及C#操作系统进程的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04

最新评论