欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#下如何實現(xiàn)Server-Sent Event(SSE)

 更新時間:2025年07月09日 08:46:26   作者:Ping通途說 (doupoa.site)  
用戶因缺乏C#實現(xiàn)SSE服務(wù)的參考資料,自行采用HttpListener庫搭建服務(wù)端,基于協(xié)議實現(xiàn)非穩(wěn)定性數(shù)據(jù)傳輸,并附代碼注釋分享經(jīng)驗,供開發(fā)者參考

1.引言

最近有個C#項目需要實現(xiàn)SSE服務(wù),但在網(wǎng)上找了一圈都沒有相關(guān)的文章,那就只能根據(jù)服務(wù)的協(xié)議自己寫了。

在這里分享下,希望能幫助有需要的開發(fā)者。

2.功能實現(xiàn)

項目要求不高,不要求每次傳輸?shù)臄?shù)據(jù)必達客戶端,即不追求穩(wěn)定性,因此在功能實現(xiàn)上我使用HttpListener庫作為功能的服務(wù)端。

相關(guān)協(xié)議內(nèi)容請自行參照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}/");  // 監(jiān)聽配置文件中的IP地址,必須以`/`結(jié)尾
            listener.Start();
            listener.BeginGetContext(GetContentCallBack, listener); //當(dāng)創(chuàng)建連接后響應(yīng)的函數(shù)
        } catch (Exception ex) {
            MessageBox.Show("創(chuàng)建服務(wù)異常,請檢查端口是否被占用:\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; //異步服務(wù),避免阻塞,也能接收多條連接
        if (_listener.IsListening) {
            HttpListenerContext context = _listener.EndGetContext(ar);
            _listener.BeginGetContext(new AsyncCallback(GetContentCallBack), _listener); // 創(chuàng)建新線程監(jiān)聽其他請求

            HttpListenerRequest req = context.Request; //獲取連接請求體
            if (req.HttpMethod == "GET") //SSE只接受GET請求
            {
                HttpListenerResponse response = context.Response; //獲取連接響應(yīng)體
                response.StatusCode = (int) HttpStatusCode.OK; //設(shè)定狀態(tài)碼
                response.ContentType = "text/event-stream;charset=UTF-8"; //設(shè)定SSE的響應(yīng)頭
                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; //各種各樣的響應(yīng)頭
                using(var stream = response.OutputStream) { //創(chuàng)建響應(yīng)體自帶的緩存流
                    while (true) {
                        try {
                            var data = Encoding.UTF8.GetBytes($ "Event: message\ndata: Hello World!\n\n"); //必須以UTF8編碼發(fā)送數(shù)據(jù)
                            stream.Write(data, 0, data.Length);
                            Thread.Sleep(1000); //一秒發(fā)送一次數(shù)據(jù)
                        } catch { //有問題直接catch
                                }));
                            }
                            _listener.Close(); //關(guān)閉當(dāng)前線程的連接
                            break; //當(dāng)前連接響應(yīng)函數(shù)運行完畢
                        }
                    }
                }
            }
        }
    }

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#中的LINQ?to?Objects詳解(2)

    C#中的LINQ?to?Objects詳解(2)

    本文詳細講解了C#中的LINQ?to?Objects,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C#中new關(guān)鍵字的三種用法

    C#中new關(guān)鍵字的三種用法

    在C#中,new關(guān)鍵字具有多種不同的用途,主要包括以下三個:作為運算符,作為修飾符,作為泛型約束,文章通過代碼示例將這三種用法介紹的非常詳細,需要的朋友可以參考下
    2024-07-07
  • C#中Span相關(guān)的性能優(yōu)化建議

    C#中Span相關(guān)的性能優(yōu)化建議

    Span 是C#7.2引入的一種新類型,在.NET Core 2.1運行時中受支持,Span 提供對內(nèi)存連續(xù)區(qū)域的類型安全訪問,這篇文章主要給大家介紹了關(guān)于C#中Span相關(guān)的一些性能優(yōu)化建議,需要的朋友可以參考下
    2021-08-08
  • C#實現(xiàn)雙端隊列的示例代碼

    C#實現(xiàn)雙端隊列的示例代碼

    雙端隊列是一種可以在兩端擴展或收縮的序列化容器,本文主要介紹了C#實現(xiàn)雙端隊列的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • C#逐行讀取文本文件的幾種有效方法

    C#逐行讀取文本文件的幾種有效方法

    在C#中,我們可以使用各種方法來讀取和寫入文本文件,本文主要給大家介紹了C#逐行讀取文本文件的幾種有效方法,并通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2025-01-01
  • C#把數(shù)字轉(zhuǎn)換成大寫金額的代碼實例

    C#把數(shù)字轉(zhuǎn)換成大寫金額的代碼實例

    這篇文章主要介紹了C#把數(shù)字轉(zhuǎn)換成大寫金額的代碼實例,例如把200轉(zhuǎn)換成“貳佰元”,需要的朋友可以參考下
    2014-05-05
  • C#生成隨機字符串的實例

    C#生成隨機字符串的實例

    本文介紹了“C#生成隨機字符串的實例”,需要的朋友可以參考一下
    2013-03-03
  • C#實現(xiàn)HTTP上傳文件的方法

    C#實現(xiàn)HTTP上傳文件的方法

    這篇文章主要介紹了C#實現(xiàn)HTTP上傳文件的方法,包括了發(fā)送文件與接收文件的實現(xiàn)代碼,具有不錯的參考價值,需要的朋友可以參考下
    2014-11-11
  • 基于WPF實現(xiàn)Message消息提醒控件

    基于WPF實現(xiàn)Message消息提醒控件

    這篇文章主要介紹了如何利用WPF實現(xiàn)Meesage消息提醒控件,文中的示例代碼講解詳細,對我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下
    2023-07-07
  • win7中C#的winForm編程使用savefiledialog不能彈出保存窗體的解決方法

    win7中C#的winForm編程使用savefiledialog不能彈出保存窗體的解決方法

    這篇文章主要介紹了win7中C#的winForm編程使用savefiledialog不能彈出保存窗體的解決方法,涉及針對線程的調(diào)用問題,是比較實用的技巧,需要的朋友可以參考下
    2014-12-12

最新評論