2017-10-09 2 views
-3

Ich möchte UDP und TCP nebeneinander verwenden. wenn ich TCP-Teil UDP Teil Arbeit kommentieren und wenn ich UDP Teil TCP-Teil kommentieren Arbeit. Ich brauche dann in UDP TeilGolan UDP und TCP nebeneinander

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) 
} 

} 

EDIT verwenden einige Nachrichten mit TCP senden: Indem tcp Teil oder udp an einer Funktion und nennen Sie es wie gehen tcpserver() Wir beide UDP und TCP verwenden können miteinander

+1

Yo Sie sind an einer Endlosschleife beteiligt, die TCP-Verbindungen akzeptiert, und Sie erwarten, dass sie auf magische Weise endet und in Ihre zweite Endlosschleife fällt, die das eingehende UDP verarbeitet. Es wird nicht funktionieren. Unklar warum du denkst es sollte. – EJP

+0

In der Regel ist das Verbinden von zwei Protokollen zu einem Port in Netzwerken nicht möglich. – jeevatkm

+0

'Ich möchte UDP und TCP miteinander verwenden. TCP kommuniziert nicht mit UDP. –

Antwort

1

Wie von Putu erwähnt, benötigen Sie etwas Nebenläufigkeit, damit es richtig funktioniert.

NodeJS arbeitet standardmäßig mit Callbacks, das heißt, sobald Sie eine Funktion als Parameter an eine Funktion übergeben, wird die Hauptschleife zur nächsten Anweisung freigegeben, weshalb nodejs apps diese object.method (function() {}) Muster, aber um etwas ähnliches zu erhalten, müssen Sie den TCP- und UDP-Teil in einer separaten Funktion mit jeweils einer Endlosschleife einpacken.

Zum Beweis das Konzept etwas tun, wie folgt aus:

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

Das „go“ Anweisung sagt dem Compiler, dass dieser Teil des Codes in Concurrent Modus ausgeführt werden soll, natürlich in einer realen Welt Projekt, das Sie gesetzt wird diejenigen Teil des Codes in ihre einwandfreie Funktion und rufen Sie einfach von Ihrem Hauptfunktion:

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

Mehr über Concurrency in go hier =>https://tour.golang.org/concurrency/1