2015-02-08 68 views
1

我正在玩我的第一个基本的udp服务器,我想知道如何支持并发连接?我认为我的代码一次只能得到一个连接来处理它,用tcp简单的服务器,事情似乎比这种情况更清楚,抛出一个goroutine来处理数据,但在这里我很失去了,提前感谢。如何支持使用UDP服务器并发连接go

func main() { 
    ListenerUDP("127.0.0.1", 1111) 
} 

func ListenerUDP(ip string, port int) { 
    buffer := make([]byte, 1024) 

    log.Println("Listener Started!") 
    addr := net.UDPAddr{ 
     Port: port, 
     IP: net.ParseIP(ip), 
    } 

    conn, err := net.ListenUDP("udp", &addr) 
    if err != nil { 
     log.Fatalf("Error Listening:%s\n", err.Error()) 
     panic(err) 
    } 
    defer conn.Close() 

    for { 
     _, remoteAddr, err := conn.ReadFromUDP(buffer[0:]) 
     if err != nil { 
      log.Fatalf("Error:%s\n", err) 
     } 
     // Process data here? using a > go something()? 
     fmt.Printf("Data:%s From:%v\n", buffer, remoteAddr) 
    } 

} 

回答

4

UDP is a connectionless protocol - 主机首先发送数据包而不建立连接。

为了让多个处理内核并行UDP数据包,您可能会开始了一堆够程,每做ReadFromUDP循环:

package main 

import (
     "fmt" 
     "net" 
     "runtime" 
) 

func listen(connection *net.UDPConn, quit chan struct{}) { 
     buffer := make([]byte, 1024) 
     n, remoteAddr, err := 0, new(net.UDPAddr), error(nil) 
     for err == nil { 
       n, remoteAddr, err = connection.ReadFromUDP(buffer) 
       // you might copy out the contents of the packet here, to 
       // `var r myapp.Request`, say, and `go handleRequest(r)` (or 
       // send it down a channel) to free up the listening 
       // goroutine. you do *need* to copy then, though, 
       // because you've only made one buffer per listen(). 
       fmt.Println("from", remoteAddr, "-", buffer[:n]) 
     } 
     fmt.Println("listener failed - ", err) 
     quit <- struct{}{} 
} 

func main() { 
     addr := net.UDPAddr{ 
       Port: 12345, 
       IP: net.IP{127, 0, 0, 1}, 
     } 
     connection, err := net.ListenUDP("udp", &addr) 
     if err != nil { 
       panic(err) 
     } 
     quit := make(chan struct{}) 
     for i := 0; i < runtime.NumCPU(); i++ { 
       go listen(connection, quit) 
     } 
     <-quit // hang until an error 
} 
+0

与您的代码,我从127.0.0.1:53236得到一个 - [ ],但如果我改变缓冲区:= make([] byte,0,1024) - > buffer:= make([] byte,1024)可以正常工作。 – Mmeyer 2015-02-09 01:06:14

+0

谢谢,修正。 (我以前说过这个,但当我回来时,评论不在这里,所以......) – twotwotwo 2015-02-11 18:38:44

相关问题