go语言SSE客户端
Posted 老卫同学
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go语言SSE客户端相关的知识,希望对你有一定的参考价值。
package main
import (
"fmt"
"github.com/r3labs/sse/v2"
"net/http"
"net/url"
"strings"
"time"
)
func main()
client := &http.Client
// 设置Transport字段为自定义Transport,包含代理设置
Transport: &http.Transport
Proxy: func(req *http.Request) (*url.URL, error)
// 设置代理
proxyURL, err := url.Parse("http://127.0.0.1:7890")
if err != nil
return nil, err
return proxyURL, nil
,
,
// 创建 SSE 客户端
sseClient := sse.NewClient("https://api.openai.com/v1/chat/completions")
sseClient.Connection = client
// 设置请求体
reqBody := strings.NewReader(`"model": "gpt-3.5-turbo","messages": ["role": "user", "content": "我想要去北京"],"stream": true`)
sseClient.Body = reqBody
sseClient.Method = "POST"
headers := make(map[string]string)
headers["Authorization"] = "Bearer Key"
headers["Content-Type"] = "application/json"
sseClient.Headers = headers
// 监听 SSE 事件
err := sseClient.SubscribeRaw(func(msg *sse.Event)
fmt.Printf("Received event: %v\\n", string(msg.Data))
)
if err != nil
return
// 等待事件
time.Sleep(time.Minute)
服务器客户端通信:长轮询、彗星和服务器发送事件 (SSE)
【中文标题】服务器客户端通信:长轮询、彗星和服务器发送事件 (SSE)【英文标题】:Server client communication: Long Polling, Comet, & Server-sent Events (SSE) 【发布时间】:2012-06-03 17:50:46 【问题描述】:我正在开发一个连接到服务器的 Web 应用程序,我需要服务器在给定时间向客户端推送一些信息。
因此,我开始阅读有关服务器发送事件 (SSE) 的信息,因为该网站是基于 HTML5 开发的,而 SSE 似乎符合我的要求。但是当我读到 SSE 真正做的是从客户端发送请求而不是相反的方式时,我感到非常惊讶(昨天我想我明白长轮询是一种推送仿真)。因此,我开始阅读有关 Web 套接字的信息(但似乎该标准仍是草案),并且还查看了 Comet。但我想我不能把所有的部分都放在我的脑海里。
是否有人会强调这些技术(可能还有其他一些推动技术)适合我的问题以及哪种情况更适合每种技术?
非常感谢,我想我完全迷失了这个领域。
【问题讨论】:
【参考方案1】:这个post 是一个更好的解释,讨论了关于 Long Polling、Comet、SSE 和 WebSockets 的区别/优势/等。
在大多数情况下,客户端通常必须向服务器发出第一个请求以建立连接。一旦建立连接,服务器就可以将数据推送到客户端。所以即使使用WebSockets,客户端也会向服务器发出初始请求,以在两者之间建立可靠的连接。
Server-Sent Events 使用普通的 HTTP GET 请求来建立与服务器的连接。它也是客户端的只读连接。它的好处是易于实现,因为我们不必定义新协议。问题是 HTTP 连接,即使是持久连接,也会在大约 15 秒后被大多数 Web 服务器关闭。即使对于长期存在的请求,Web 服务器通常也会在超时之后关闭连接。这就是长轮询的想法出现的地方。这是一个简单的想法,我们向服务器发出正常的 ajax 请求,服务器尽可能长时间地保持打开状态。如果请求因某种原因被服务器关闭,您会立即再次发出相同的请求。您可以使用 Node.js 之类的服务器和来自浏览器的正常 Ajax 请求轻松实现长轮询机制(即 Comet)。服务器发送事件尝试使用EventSource 抽象出浏览器端的实现。因此,您不必为长轮询/彗星实现浏览器/客户端代码,浏览器会为您处理这个。它为看似持久的连接提供了一个很好的抽象。您的网络服务器只需要查找在标头中将 Content-Type 指定为“text/event-stream”的 GET 请求,并尽可能长时间地保持 HTTP 连接打开。
我建议您不要过度复杂化什么是服务器发送事件。如果您理解一个普通的 HTTP GET 请求,那么您可能已经对其背后的想法有 90% 的理解。
SSE/Comet 与传统的长轮询之间有一个区别可能值得强调。根据我的经验,长轮询背后的想法是,在您获得更新之前,您的请求不会返回。此时 HTTP 连接关闭,随后立即发出另一个请求。使用 SSE,尽管您可以在发送更新的消息后立即关闭 HTTP 连接,但您的目标是将数据从服务器刷新到客户端,而无需实际关闭/结束 HTTP 请求。这避免了实际发出 GET 请求的开销。这可以通过常规的 ajax 请求来实现,但 SSE 再次通过 EventSource 提供了一个很好/高效的实现。
编辑:澄清 SSE 和长轮询之间的区别。
【讨论】:
以上是关于go语言SSE客户端的主要内容,如果未能解决你的问题,请参考以下文章