청크를 사용하여 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!