zoukankan      html  css  js  c++  java
  • 接收(Server-Sent Events)SSE协议的数据

    常用的HttpClient无法正常接收SSE协议的数据,会出现各种各样的Bug。因此需要使用TcpClient建立长连接来处理SSE协议的数据。

    SSE协议数据的返回头中有

    Content-Type: text/event-stream; charset=utf-8

    这样的数据会持续发送,直到连接关闭。

    采用HttpClient无法正常接受这样的数据,部分方法会一直等待直到连接关闭,例如:

    HttpClient.SendAsync();
    HttpClient.GetAsync();
    HttpClient.GetStringAsync();

    HttpClient.GetStreamAsync()

    能正常接受到流,并且可以读取。但是有些时候会不能接受完一波Event的所有数据,直到下一波Event数据才能接收到,用起来会有各种麻烦,比如Json数据不完整,没法正常解析成对象。

    因此,兼容SSE得放弃HttpClient,采用TcpClient建立长连接。

    按照标准的http协议构造报文,在Stream中发送出去。如果是Https数据,则需要用SslStream包裹从TcpClient获得的NetworkStream即可。

      1 using System.IO;
      2 using System.Net.Http;
      3 using System.Net.Sockets;
      4 using System.Text;
      5 
      6 public static void SseSend(string host, int port, string requestMessage)
      7 {
      8     using var tcp = new TcpClient();
      9     tcp.Connect(host, port);
     10     var stream = tcp.GetStream();
     11 
     12     var requestData = Encoding.UTF8.GetBytes(requestMessage);
     13     //发送HTTP请求报文和数据
     14     stream.Write(requestData);
     15 
     16     //接收HTTP响应报文和数据
     17     var responseBuffer = new byte[1024 * 1024];
     18     var receivedNum = stream.Read(responseBuffer, 0, responseBuffer.Length);
     19 }
  • 相关阅读:
    ViewData和TempData
    ASP.NET 缓存
    php配置的问题
    不错的文章
    谁能给个mvc的学习源码吗?
    win7下php + apache +mysql 5问题
    关于coolite grid 存储过程分页的问题,忘大虾解决...
    大侠们,关于asp.net与jsonp之间的东东
    jquery $.getjson $.post
    asp.net像博客园一样的Calendar(日期控件)
  • 原文地址:https://www.cnblogs.com/optimo/p/15221847.html
Copyright © 2011-2022 走看看