在golang中只有一个客户端连接到命名管道



我目前正在使用golang和c学习linux中的命名管道。我写了一个小的服务器程序来读取命名管道:

mkfifo /tmp/namedpipe.ts
ffmpeg -i url -c copy /tmp/namedpipe.ts

和web服务器应用程序像这样打开管道:

package main
import (
"bufio"
"net/http"
"fmt"
"io"
"log"
"os"
)
func main() {
f, err := os.Open("/tmp/namedpipe.ts")
if err != nil {
log.Println(err.Error())
return
}
defer f.Close()
http.HandleFunc("/test.ts", func(w http.ResponseWriter, r *http.Request) {
w.Header().Add("Content-Type", "video/MP2T")
w.Header().Add("Cache-Control", "no-store")
w.Header().Add("Connection", "close")
reader := bufio.NewReader(f)
for {
line, err := reader.ReadBytes('n')
if err != nil {
log.Fatal("Couldn't read line, ", err)
}
w.Write(line)
}
})
log.Fatal(http.ListenAndServe(":8081", nil))
}

只要只有一个客户端连接到管道,这工作得很好。它既能读又能写。如果我尝试连接第二个客户端,代码永远不会超过

行。我想修改这段代码,并在不冻结图像和不崩溃的情况下同时添加多个客户端从Named Pipe读取。

当您使用无限循环时,应该有一个break语句,一旦客户/客户端在从API下载文件后消费API,它不应该是循环和内部错误的一部分,应该有一个检查EOF,在那一刻,您应该是break

package main
import (
"bufio"
"io"
"log"
"net/http"
"os"
)
func main() {
f, err := os.Open("/tmp/namedpipe.ts")
if err != nil {
log.Println(err.Error())
return
}
defer f.Close()
http.HandleFunc("/test.ts", func(w http.ResponseWriter, r *http.Request) {
w.Header().Add("Content-Type", "video/MP2T")
w.Header().Add("Cache-Control", "no-store")
w.Header().Add("Connection", "close")
reader := bufio.NewReader(f)
for {
line, err := reader.ReadBytes('n')
if err != nil {
if err == io.EOF {
break
}
log.Fatal("Couldn't read line, ", err)
}
w.Write(line)
}
})
log.Fatal(http.ListenAndServe(":8081", nil))
}

最新更新