2016-10-31 37 views
0

GoのWebアプリケーションに沿ってRTMPプロトコルを実装しようとしていますが、両方を処理するソリューションを見つけられないようですHTTP、およびRTMPを同一ポート上に作成します。Go - 同じポート上で複数のプロトコル(HTTPとRTMP)をリッスンしているWebサーバー

このような考えがあります。

package main 

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

func main() { 
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { 
     io.WriteString(w, "Hello!") 
    }) 

    http.HandleFunc("/rtmp", func(w http.ResponseWriter, r *http.Request) { 
     // RTMP handling here 
    }) 

    fmt.Println("Starting web server") 
    http.ListenAndServe(":8000", nil) 
} 

zhangpeihao/gortmp TCPソケット上で待機することによりRTMPを扱うan example that showsと素晴らしいRMTPモジュールを持っています。しかし、それを第2のポートではなく特定のエンドポイントでどのように処理できますか?

+1

私は他のプロトコル内別にトンネリングプロトコルからあなたはトンネルに必要な[HTTP経由でRTMP](https://en.wikipedia.org/wiki/Real-Time_Messaging_Protocol#HTTP_tunneling) –

+0

を推測している、それはに珍しいですポートごとに複数のプロトコルを提供します。私は、あなたが採用するハンドラを決めるまで、受け取った最初の数バイトでいくつかの解決策を検討することを想像しています。私はこれが試みられたことは一度も見たことがありません。 –

答えて

0

RTMPTをRTMPに変換する必要がなく、他のモジュールをフォークしなくても、最初のバイトを読み取ることで、これは私の最終的な解決策でした。完全実装はhereです。

func createLocalConnection(port string) *net.TCPConn { 
    addr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:"+port) 
    if err != nil { 
     panic(err) 
    } 
    conn, err := net.DialTCP("tcp", nil, addr) 
    if err != nil { 
     panic(err) 
    } 
    return conn 
} 

func proxyConnection(conn *net.TCPConn) { 
    defer conn.Close() 
    data := make([]byte, 1) 
    n, err := conn.Read(data) 
    if err != nil { 
    fmt.Println(err) 
    return 
    } 

    var proxyConn *net.TCPConn 
    if data[0] == 0x03 { // RTMP first byte. 
    proxyConn = createLocalConnection(RTMPPort) 
    } else { 
    proxyConn = createLocalConnection(HTTPPort) 
    } 
    proxyConn.Write(data[:n]) 
    defer proxyConn.Close() 

    // Request loop 
    go func() { 
    for { 
     data := make([]byte, 1024*1024) 
     n, err := conn.Read(data) 
     if err != nil { 
     break 
     } 
     proxyConn.Write(data[:n]) 
    } 
    }() 

    // Response loop 
    for { 
    data := make([]byte, 1024*1024) 
    n, err := proxyConn.Read(data) 
    if err != nil { 
     break 
    } 
    conn.Write(data[:n]) 
    } 
} 

func main() { 
    listener, err := net.ListenTCP("tcp", addr) 
    if err != nil { 
     panic(err) 
    } 

    for { 
    conn, err := listener.AcceptTCP() 
    if err != nil { 
     fmt.Println(err) 
     continue 
    } 

    go server.ProxyConnection(conn) 
    } 
} 
関連する問題