2017-10-09 107 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