>백엔드 개발 >Golang >Go HTTP 서버에서 데이터를 청크로 순차적으로 보내는 방법은 무엇입니까?

Go HTTP 서버에서 데이터를 청크로 순차적으로 보내는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-29 04:30:08697검색

How to Send Data Sequentially in Chunks from a Go HTTP Server?

청크를 사용하여 Go 서버에서 순차적으로 데이터 전송

Go에서 HTTP 서버를 생성할 때 응답을 보내는 것이 유용할 수 있습니다. 데이터를 청크로 나누어서 데이터를 검색할 때 점진적으로 전송할 수 있습니다. 이를 통해 클라이언트는 순차적인 방식으로 데이터를 수신할 수 있습니다.

그러나 클라이언트가 미리 결정된 기간이 끝날 때만 청크를 수신하거나 Go가 자동으로 Content-Length 헤더를 설정하는 경우 답답할 수 있습니다. . 이 문제를 해결하려면 Go에서 청크된 HTTP 응답의 미묘한 차이를 조사해야 합니다.

먼저 Transfer-Encoding 헤더가 Go의 HTTP 응답 작성기에 의해 암시적으로 처리된다는 점을 기억하는 것이 중요합니다. 따라서 명시적으로 설정할 필요가 없습니다.

순차 청크 전달을 달성하는 열쇠는 Flusher.Flush()를 사용하는 데 있습니다. 각 청크가 작성된 후 이 메서드를 호출하면 "청크" 인코딩이 트리거되고 데이터가 클라이언트에 전송됩니다. 이렇게 하면 클라이언트가 준비된 각 청크를 수신할 수 있습니다.

다음은 이 기술을 구현하는 방법의 예입니다.

import (
    "fmt"
    "io"
    "log"
    "net/http"
    "time"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        flusher, ok := w.(http.Flusher)
        if !ok {
            panic("expected http.ResponseWriter to be an http.Flusher")
        }
        w.Header().Set("X-Content-Type-Options", "nosniff")
        for i := 1; i <= 10; i++ {
            fmt.Fprintf(w, "Chunk #%d\n", i)
            flusher.Flush() // Trigger "chunked" encoding and send a chunk...
            time.Sleep(500 * time.Millisecond)
        }
    })

    log.Print("Listening on localhost:8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

이 접근 방식을 사용하면 Go HTTP 서버가 청크를 순차적으로 전송하여 클라이언트가 적시에 데이터를 수신할 수 있도록 합니다. 또한 http.ResponseWriters는 여러 고루틴에서 사용하기 위한 동시 액세스를 지원한다는 점을 기억하는 것이 중요합니다. 이를 통해 필요한 경우 다른 스레드나 고루틴에서 청크를 보낼 수 있습니다.

위 내용은 Go HTTP 서버에서 데이터를 청크로 순차적으로 보내는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.