最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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); //當創(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)閉當前線程的連接
                            break; //當前連接響應(yīng)函數(shù)運行完畢
                        }
                    }
                }
            }
        }
    }

總結(jié)

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

相關(guān)文章

最新評論

阿勒泰市| 山阳县| 大埔县| 江西省| 三江| 萍乡市| 陆丰市| 邯郸市| 福鼎市| 岗巴县| 巴林左旗| 小金县| 丰镇市| 东台市| 青田县| 长寿区| 泸西县| 财经| 西乌珠穆沁旗| 彩票| 家居| 马边| 禄丰县| 正安县| 平果县| 河源市| 慈溪市| 东台市| 房山区| 宝鸡市| 水富县| 淄博市| 梓潼县| 清水河县| 突泉县| 盐边县| 杨浦区| 呼伦贝尔市| 岢岚县| 册亨县| 应城市|