Heim  >  Artikel  >  Web-Frontend  >  Detaillierte Einführung in Server-Push-Ereignisse

Detaillierte Einführung in Server-Push-Ereignisse

零下一度
零下一度Original
2017-07-26 18:08:292014Durchsuche

Vom Server gesendete Ereignisse sind eine unidirektionale Kommunikation, die auf dem WebSocket-Protokoll basiert, bei dem der Server Ereignisse und Daten an den Client sendet. Derzeit unterstützen alle gängigen Browser vom Server gesendete Ereignisse, außer natürlich Internet Explorer. 2333...

Das WebSocket-Protokoll ist nach dem HTTP-Protokoll ein weiteres Server-Client-Kommunikationsprotokoll, bei dem es sich um einen einfachen Client handelt, der eine Serverantwort anfordert, und unterstützt den unidirektionalen Kommunikationsmodus Zwei -Wege-Kommunikation zwischen Server und Client.

Verwendung von vom Server gesendeten Ereignissen

Vom Server gesendete Ereignisse (im Folgenden als SSE bezeichnet) als Server => Für die Client-Kommunikationsmethode muss der Client über die entsprechende Dienstadresse und Antwortmethode verfügen, und der Server muss ohne weiteres über die entsprechende Datensendemethode verfügen. Kommen wir zum Code!

Clientseitiger JS-Code

 H5页面需添加如下JS代码:     <script>         if (typeof (EventSource) !== "undefined") {             //推送服务接口地址 var eventSource = new EventSource("http://localhost:2242/webservice/ServerSent/SentNews");             //当通往服务器的连接被打开 eventSource.onopen = function () {                 console.log("连接打开...");             }              //当错误发生  eventSource.onerror= function (e) {                  console.log(e);              };              //当接收到消息,此事件为默认事件  eventSource.onmessage = function (event) {                  console.log("onmessage...");               eventSource.close()//关闭SSE链接
              };              //服务器推送sentMessage事件  eventSource.addEventListener('sentMessage', function (event) { 
                  var data = eval('('+event.data+')');//服务器端推送的数据,eval装换Json对象  var origin = event.origin;//服务器 URL 的域名部分,即协议、域名和端口,表示消息的来源。  var lastEventId = event.lastEventId;////数据的编号,由服务器端发送。如果没有编号,这个属性为空。  //此处根据需求编写业务逻辑  console.log(data);              }, false);          } else {              //浏览器不支持server-sent events 所有主流浏览器均支持服务器发送事件,除了 Internet Explorer。  document.getElementById("result").innerHTML = "Sorry, your browser does not support server-sent events...";          }      </script>

Serverseitig

Welches Datenformat soll der Server zurückgeben? Welche Art von Antwort sollte dem Kunden gegeben werden? Beginnen wir mit einem .Net-Beispiel

     /// <summary>/// 推送消息/// </summary>/// <returns></returns>        [HttpGet]public HttpResponseMessage SentNews()
        {
            HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK);try{//response.Headers.Add("Access-Control-Allow-Origin", "*");//如需要跨域可配置string data_str = “推送至客户端的数据”;//当然可以是json字符串格式string even = "", data = "";if (!string.IsNullOrWhiteSpace(data_str))
                {
                    even = "event:sentMessage\n";
                    data = "data:" + data_str + "\n\n";
                }string retry = "retry:" + 1000 + "\n";//连接断开后重连时间(毫秒),其实可以理解为轮询时间 2333...byte[] array = Encoding.UTF8.GetBytes(even + data + retry);
                Stream stream_result = new MemoryStream(array);
                response.Content = new StreamContent(stream_result);
                response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/event-stream");//此处一定要配置response.Headers.CacheControl = new CacheControlHeaderValue();
                response.Headers.CacheControl.NoCache = false;
            }catch (Exception ex)
            {
                LogHelper.WriteWebLog(ex);
            }return response;
        }

Nachdem Sie den obigen Code gelesen haben, sollten Sie meiner Meinung nach eine Idee haben. Die Antwortmethode ist immer noch HTTPResponse. Aber es gibt immer ein paar kleine Anforderungen:

  • Der Antwortheader „Content-Type“ sollte auf „text/event-stream“ gesetzt sein

Das Antwortdatenformat sollte auch die Tags „data:“, „event:“ und „retry:“ im obigen Code beachten:

  1. Ereignis: Gibt den Ereignistyp an, der von dieser Zeile zur Deklaration verwendet wird. Wenn der Browser Daten empfängt, generiert er Ereignisse des entsprechenden Typs.

  2. Daten: Zeigt an, dass die Zeile Daten enthält. Zeilen, die mit Daten beginnen, können mehrfach vorkommen. Alle diese Zeilen sind Daten für dieses Ereignis.

  3. Wiederholen: Gibt an, dass diese Zeile verwendet wird, um die Wartezeit des Browsers anzugeben, bevor die Verbindung nach dem Trennen der Verbindung wiederhergestellt wird.

  4. id: Gibt die Kennung (d. h. die Nummer der Daten) an, die von dieser Zeile zum Deklarieren des Ereignisses verwendet wird, was nicht häufig verwendet wird.

Das Obige ist eine einfache Anwendung von Vom Server gesendeten Ereignissen. Wenn Sie interessiert sind, können Sie es selbst bedienen die Wirkung!

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in Server-Push-Ereignisse. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn