Golang UDP和TCP彼此相邻

时间:2017-10-09 09:23:12

标签: sockets go tcp

是否可以在一个脚本中相互使用TCP和UDP?我需要一些我的包用TCP发送和接收,其中一些用UDP

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 part或udp部分并像调用tcpServer()一样调用它们,我们可以互相使用UDP和TCP

1 个答案:

答案 0 :(得分:1)

正如putu所说,你需要一些并发才能使它正常工作。

NodeJS默认使用回调,这意味着一旦将函数作为参数传递给函数,它将释放主循环到下一条指令。这就是NodeJS应用程序具有object.method(function(){})模式的原因。要在Go中实现与此类似的功能,您需要将程序的TCP和UDP部分包装在一个单独的goroutine中,每个部分都有一个无限循环。

对于一个简单的证明这个概念,做这样的事情:

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

那个“go”指令告诉编译器一部分代码应该并发运行。在实际项目中,您将把该部分代码放在适当的函数中,并从主函数中按名称调用它:

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

有关并发性的更多信息,请访问此处=> https://tour.golang.org/concurrency/1