2017-10-09 55 views
-3

我想在彼此旁邊使用UDP和TCP。當我評論TCP部分UDP部分工作和當我評論UDP部分TCP部分工作時。 我需要發送帶有TCP一些消息,然後在UDP部分Golang UDP和TCP彼此相鄰

func main() { 

// 
// ─── TCP ──────────────────────────────────────────────────────────────────── 
// 

// Listen for incoming connections. 
l, err := net.Listen("tcp", "localhost"+":"+"3000") 
if err != nil { 
    fmt.Println("Error listening:", err.Error()) 
    os.Exit(1) 
} 

// Close the listener when the application closes. 
defer l.Close() 
fmt.Println("Listening on " + "localhost" + ":" + "3000") 
for { 
    // Listen for an incoming connection. 
    conn, err := l.Accept() 
    if err != nil { 
     fmt.Println("Error accepting: ", err.Error()) 
     os.Exit(1) 
    } 
    // Handle connections in a new goroutine. 
    go gotcp.HandleRequest(conn) 
    //go handler(conn) 
} 

// 
// ─── UDP ──────────────────────────────────────────────────────────────────── 
// 

// then we should check which struct is empty and fill them 

/* Lets prepare a address at any address at port 10001*/ 
ServerAddr, err := net.ResolveUDPAddr("udp", ":3000") 
goudp.CheckError(err) 

/* Now listen at selected port */ 
ServerConn, err := net.ListenUDP("udp", ServerAddr) 
goudp.CheckError(err) 
defer ServerConn.Close() 

buf := make([]byte, 1024) 

for { 
    n, addr, err := ServerConn.ReadFromUDP(buf) 
    //fmt.Println("Received ", string(buf[0:n]), " from ", addr) 
    if err != nil { 
     fmt.Println("Error: ", err) 
    } 

    // *** broadcasting 
    //start := time.Now() 
    if v, ok := goudp.RRoom()[djr]; ok { 
     //fmt.Println("get room name ", v) 
     go goudp.BroadCast(string(buf[0:n]), djr, ServerConn, v) 
     //delete(R, "x") 
     //go sendResponse(ServerConn, v.UserAddr1) 
    } 
    //elapsed := time.Since(start) 
    //log.Printf("Binomial took %s", elapsed) 
} 

} 

編輯使用: 通過傳遞TCP部分或UDP部分的功能,並調用它像去TCPSERVER(),我們可以同時使用UDP和TCP彼此相關

+1

呦你正在從事一個接受TCP連接的無限循環,並且你期望它會奇蹟般地退出並進入你處理傳入UDP的第二個無限循環。它不會工作。不清楚爲什麼你認爲它應該。 – EJP

+0

通常將兩個協議綁定到一個端口在聯網中是不可行的。 – jeevatkm

+0

'我想互相使用UDP和TCP .'沒辦法。 TCP不與UDP通信。 –

回答

1

正如putu指出的那樣,您需要一些併發才能正常工作。 ()函數(函數()函數),這是爲什麼nodejs應用程序有這個object.method(函數()函數) {})模式,但要獲得與此相似的內容,您需要將TCP和UDP部分封裝在一個單獨的函數中,每個函數都有一個無限循環。

爲了證明這個概念做這樣的事情:

... 
go func(){ 
    // paste your tcp code here 
} 
... 
go func(){ 
    // paste your udp code here 
} 

即「走出去」說明書上說該代碼的這部分應並行方式在實際項目中,您將設置運行過程中,編譯器在這些代碼部分的正常運作,並從你的主要功能只要致電:

... 
go serveTCP(); 
go serve UDP(); 
... 

更多的併發去這裏=>https://tour.golang.org/concurrency/1