Rumah >pembangunan bahagian belakang >Tutorial Python >Melaksanakan Acara Dihantar Pelayan (SSE) dengan Python dan Go
Dalam aplikasi web interaktif hari ini, kemas kini data masa nyata adalah penting dalam meningkatkan pengalaman pengguna. Di antara pelbagai teknologi komunikasi masa nyata, Server-Sent Events (SSE) menonjol sebagai penyelesaian yang mudah tetapi berkesan. SSE membenarkan pelayan menolak kemas kini masa nyata kepada pelanggan melalui HTTP.
Peristiwa Dihantar Pelayan (SSE) ialah teknologi yang digunakan untuk membolehkan pelayan menolak data kepada klien secara proaktif, juga dikenali sebagai "Strim Acara." Ia berdasarkan protokol HTTP dan mengambil kesempatan daripada ciri sambungannya yang tahan lama. SSE mewujudkan sambungan berterusan antara klien dan pelayan, membolehkan pelayan menghantar kemas kini data masa nyata kepada klien. Walau bagaimanapun, pelanggan tidak boleh menghantar data kembali ke pelayan melalui SSE.
Acara Dihantar Pelayan adalah sebahagian daripada spesifikasi HTML5, direka khusus untuk menolak acara daripada pelayan kepada pelanggan. Kesederhanaan, penyambungan semula automatik dan ciri penjejakan acara menjadikannya sesuai untuk senario yang memerlukan aliran data satu arah. SSE berprestasi sangat baik apabila data distrim dalam satu arah.
SSE membolehkan pelayan menolak mesej ke penyemak imbas dalam masa nyata. Sebagai sebahagian daripada spesifikasi HTML5, ia melibatkan:
Walaupun WebSockets juga menawarkan komunikasi masa nyata, ia berbeza dengan ketara:
Feature | SSE | WebSockets |
---|---|---|
Protocol Basis | HTTP | TCP |
Data Flow | Unidirectional (server to client) | Full-duplex (bidirectional) |
Complexity | Lightweight and simple | More complex |
Reconnection | Built-in | Manual implementation needed |
Message Tracking | Automatic | Manual implementation needed |
Data Types | Text or Base64-encoded binary | Various data types supported |
Event Types Support | Custom events supported | Custom events not supported |
Limitations | HTTP/1.1 or HTTP/2 | Unlimited connections |
Pada asasnya, penyemak imbas memulakan permintaan HTTP dan pelayan bertindak balas dengan status HTTP bersama-sama dengan pengepala ini:
Content-Type: text/event-stream Cache-Control: no-cache Connection: keep-alive
SSE menentukan bahawa jenis MIME untuk strim acara mestilah teks/strim-acara. Penyemak imbas tidak boleh menyimpan data cache dan sambungan harus kekal berterusan (kekal hidup).
Strim acara menggunakan teks berkod UTF-8 atau mesej binari berkod Base64 yang dimampatkan dengan gzip. Setiap mesej terdiri daripada satu atau lebih medan, diformatkan sebagai field-name : field-value. Setiap medan berakhir dengan n. Baris yang bermula dengan titik bertindih ialah ulasan, diabaikan oleh penyemak imbas. Berbilang mesej dalam satu tolak dipisahkan oleh baris kosong (nn).
Berikut ialah pelaksanaan menggunakan Python:
from flask import Flask, Response app = Flask(__name__) @app.route('/events') def sse_handler(): def generate(): paragraph = [ "Hello, this is an example of a continuous text output.", "It contains multiple sentences, each of which will be sent to the client as an event.", "This is to simulate the functionality of Server-Sent Events (SSE).", "We can use this method to push real-time updates.", "End of sample text, thank you!", ] for sentence in paragraph: yield f"data: {sentence}\n\n" import time time.sleep(1) return Response(generate(), mimetype='text/event-stream') if __name__ == '__main__': app.run(host='0.0.0.0', port=8081, debug=True)
Berikut ialah pelaksanaan menggunakan Go:
package main import ( "fmt" "log" "net/http" "time" ) func main() { http.HandleFunc("/events", sseHandler) fmt.Println("Starting server on :8080") if err := http.ListenAndServe(":8080", nil); err != nil { log.Fatalf("Server error: %v", err) } } func sseHandler(w http.ResponseWriter, r *http.Request) { flusher, ok := w.(http.Flusher) if !ok { http.Error(w, "Streaming unsupported!", http.StatusInternalServerError) return } w.Header().Set("Content-Type", "text/event-stream") w.Header().Set("Cache-Control", "no-cache") w.Header().Set("Connection", "keep-alive") paragraph := []string{ "Hello, this is an example of a continuous text output.", "It contains multiple sentences, each of which will be sent to the client as an event.", "This is to simulate the functionality of Server-Sent Events (SSE).", "We can use this method to push real-time updates.", "End of sample text, thank you!", } for _, sentence := range paragraph { _, err := fmt.Fprintf(w, "data: %s\n\n", sentence) if err != nil { return } flusher.Flush() time.Sleep(1 * time.Second) } }
Di sisi klien, API EventSource JavaScript membenarkan anda mencipta objek EventSource untuk mendengar acara yang dihantar pelayan. Setelah disambungkan, pelayan boleh menghantar mesej acara ke penyemak imbas. Penyemak imbas mengendalikan mesej ini dengan mendengar peristiwa onmessage, onopen dan onerror.
<!DOCTYPE html> <html lang="en"> <kepala> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Contoh SSE ?</title> </head> <badan> <h1>Contoh Acara Dihantar Pelayan ?</h1> <div> <h2> Alat Nyahpepijat SSE </h2> <p>Pada masa ini, banyak alatan popular seperti Posman, Insomnia, Bruno dan ThunderClient tidak mempunyai sokongan yang mencukupi untuk menyahpepijat Acara Dihantar Pelayan (SSE). Had ini boleh menjadi agak mengecewakan semasa pembangunan. Nasib baik, EchoAPI menyediakan keupayaan penyahpepijatan SSE yang sangat baik, meningkatkan kecekapan dan produktiviti aliran kerja dengan sangat baik.</p> <p><img src="https://img.php.cn/upload/article/000/000/000/173482771419125.jpg" alt="Implementing Server-Sent Events (SSE) with Python and Go"></p> <p>Jika anda menggunakan penyahpepijatan SSE atau API, saya amat mengesyorkan mencuba EchoAPI. Ia boleh merevolusikan pengalaman penyahpepijatan anda dan menyelaraskan proses pembangunan anda. Untuk maklumat lanjut, lawati echoapi.com. </p><h3> Contoh: Pelanggan EchoAPI untuk SSE </h3> <p>Dalam EchoAPI, menggunakan antara muka SSE adalah mudah. Hanya masukkan URL, isikan parameter yang berkaitan dan klik "<strong>Hantar</strong>" untuk melihat hasil permintaan anda.</p> <p><img src="https://img.php.cn/upload/article/000/000/000/173482771591634.jpg" alt="Implementing Server-Sent Events (SSE) with Python and Go"></p>
Atas ialah kandungan terperinci Melaksanakan Acara Dihantar Pelayan (SSE) dengan Python dan Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!