使用libp2p-http构建HLS时遇到的问题

huangapple go评论177阅读模式
英文:

Troubles on constructing HLS using libp2p-http

问题

我打算使用libp2p实现一个经典的HLS示例,示例代码如下:
https://hackernoon.com/building-a-media-streaming-server-using-go-and-hls-protocol-j85h3wem
但是我遇到了以下错误:

404页面未找到

我的代码构建监听:

  1. m1, _ := multiaddr.NewMultiaddr("/ip4/127.0.0.1/tcp/1000")
  2. m2, _ := multiaddr.NewMultiaddr("/ip4/127.0.0.1/tcp/1001")
  3. srvHost := NewHost(m1)
  4. clientHost := NewHost(m2)
  5. defer srvHost.Close()
  6. defer clientHost.Close()
  7. srvHost.Peerstore().AddAddrs(clientHost.ID(), clientHost.Addrs(), peerstore.PermanentAddrTTL)
  8. fmt.Println("id is", clientHost.ID())
  9. fmt.Println("addr is", srvHost.Addrs())
  10. clientHost.Peerstore().AddAddrs(srvHost.ID(), srvHost.Addrs(), peerstore.PermanentAddrTTL)
  11. listener, err := gostream.Listen(srvHost, "/testiti-test")
  12. if err != nil {
  13. panic(err)
  14. }
  15. defer listener.Close()

我的代码构建客户端:

  1. tr := &http.Transport{}
  2. tr.RegisterProtocol("libp2p", p2phttp.NewTransport(clientHost, p2phttp.ProtocolOption("/testiti-test")))
  3. client := &http.Client{Transport: tr}
  4. res, err := client.Get(fmt.Sprintf("libp2p://%s/simple", port))
  5. if err != nil {
  6. panic(err)
  7. }
  8. data, err := ioutil.ReadAll(res.Body)
  9. defer res.Body.Close()
  10. if err != nil {
  11. log.Fatal(err)
  12. }
  13. fmt.Println(string(data))

我的代码构建服务器:

  1. go func() {
  2. http.HandleFunc("/simple", addHeaders(http.FileServer(http.Dir(songsDir))))
  3. //http.HandleFunc("/simple", addHeaders2())
  4. fmt.Printf("Starting server on %v\n", port)
  5. log.Printf("Serving %s on HTTP port: %v\n", songsDir, port)
  6. server := &http.Server{}
  7. server.Serve(listener)
  8. }()
  9. func addHeaders(h http.Handler) http.HandlerFunc {
  10. return func(w http.ResponseWriter, r *http.Request) {
  11. w.Header().Set("Access-Control-Allow-Origin", "*")
  12. h.ServeHTTP(w, r)
  13. }
  14. }

新建主机:

  1. func NewHost(listen multiaddr.Multiaddr) host.Host {
  2. h, err := libp2p.New(
  3. libp2p.ListenAddrs(listen),
  4. )
  5. if err != nil {
  6. panic(err)
  7. }
  8. return h
  9. }
英文:

I intend to implement a classic HLS example with libp2p, which is as follows
https://hackernoon.com/building-a-media-streaming-server-using-go-and-hls-protocol-j85h3wem
But I encountered the following errors:

> 404 page not found

My code constructing linstening:

  1. m1, _ := multiaddr.NewMultiaddr("/ip4/127.0.0.1/tcp/1000")
  2. m2, _ := multiaddr.NewMultiaddr("/ip4/127.0.0.1/tcp/1001")
  3. srvHost := NewHost(m1)
  4. clientHost := NewHost(m2)
  5. defer srvHost.Close()
  6. defer clientHost.Close()
  7. srvHost.Peerstore().AddAddrs(clientHost.ID(), clientHost.Addrs(), peerstore.PermanentAddrTTL)
  8. fmt.Println("id is", clientHost.ID())
  9. fmt.Println("addr is", srvHost.Addrs())
  10. clientHost.Peerstore().AddAddrs(srvHost.ID(), srvHost.Addrs(), peerstore.PermanentAddrTTL)
  11. listener, err := gostream.Listen(srvHost, "/testiti-test")
  12. if err != nil {
  13. panic(err)
  14. }
  15. defer listener.Close()

My code constructing client:

  1. tr := &http.Transport{}
  2. tr.RegisterProtocol("libp2p", p2phttp.NewTransport(clientHost, p2phttp.ProtocolOption("/testiti-test")))
  3. client := &http.Client{Transport: tr}
  4. res, err := client.Get(fmt.Sprintf("libp2p://%s/simple", port))
  5. if err != nil {
  6. panic(err)
  7. }
  8. data, err := ioutil.ReadAll(res.Body)
  9. defer res.Body.Close()
  10. if err != nil {
  11. log.Fatal(err)
  12. }
  13. fmt.Println(string(data))

My code constructing sever:

  1. go func() {
  2. http.HandleFunc("/simple", addHeaders(http.FileServer(http.Dir(songsDir))))
  3. //http.HandleFunc("/simple", addHeaders2())
  4. fmt.Printf("Starting server on %v\n", port)
  5. log.Printf("Serving %s on HTTP port: %v\n", songsDir, port)
  6. server := &http.Server{}
  7. server.Serve(listener)
  8. }()
  9. func addHeaders(h http.Handler) http.HandlerFunc {
  10. return func(w http.ResponseWriter, r *http.Request) {
  11. w.Header().Set("Access-Control-Allow-Origin", "*")
  12. h.ServeHTTP(w, r)
  13. }
  14. }

New host:

  1. func NewHost(listen multiaddr.Multiaddr) host.Host {
  2. h, err := libp2p.New(
  3. libp2p.ListenAddrs(listen),
  4. )
  5. if err != nil {
  6. panic(err)
  7. }
  8. return h
  9. }

答案1

得分: 0

问题是由路由引起的。对于一个 http.FileServer,"\simple" 表示一个目录而不是一个 URL。所以只需要像这样修复:

  1. url := fmt.Sprintf("libp2p://%s/origin.m3u8", port)
  2. res, err := client.Get(url)
  3. if err != nil {
  4. panic(err)
  5. }
  6. data, err := ioutil.ReadAll(res.Body)
  7. defer res.Body.Close()
  8. if err != nil {
  9. log.Fatal(err)
  10. }
  11. fmt.Println(string(data))
英文:

The problem is casued by routing.For a http.FileServer,"\simple" means a dir but not a url.So just fix like this:

  1. url := fmt.Sprintf("libp2p://%s/origin.m3u8", port)
  2. res, err := client.Get(url)
  3. if err != nil {
  4. panic(err)
  5. }
  6. data, err := ioutil.ReadAll(res.Body)
  7. defer res.Body.Close()
  8. if err != nil {
  9. log.Fatal(err)
  10. }
  11. fmt.Println(string(data))

huangapple
  • 本文由 发表于 2022年2月7日 17:21:33
  • 转载请务必保留本文链接:https://go.coder-hub.com/71016113.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定