gpt4 book ai didi

sockets - Golang UDP 和 TCP 并排

转载 作者:数据小太阳 更新时间:2023-10-29 03:44:30 26 4
gpt4 key购买 nike

是否可以在一个脚本中同时使用 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 部分或 udp 部分并像 go tcpServer() 一样调用它,我们可以同时使用 UDP 和 TCP

最佳答案

正如 putu 所指出的,您需要一些并发性才能使其正常工作。

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

关于sockets - Golang UDP 和 TCP 并排,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46642990/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com