Ich suche eine gute Lösung für eine Client/Server-Kommunikation mit UDP-Sockets in Go Sprache.Schreiben an Client UDP Socket in Go
Die Beispiele, die ich im Internet gefunden habe, zeigen mir, wie man Daten an den Server sendet, aber sie lehren nicht, wie man sie zurück zum Client sendet.
Um zu demonstrieren, mein Programm führt Folgendes aus:
Mein Client-Programm erstellt eine Buchse auf der 4444-Port, wie folgt aus:
con, err := net.Dial("udp", "127.0.0.1:4444")
ich einen String und die lokale Adresse an den Server gesendet, So könnte die Zeichenfolge gedruckt und eine OK-Nachricht gesendet werden. Ich verwende gob dafür:
enc := gob.NewEncoder(con)
enc.Encode(Data{"test", con.LocalAddr().String()})
Meine Daten Struktur sieht wie folgt aus:
type Data struct{
Msg string
Addr string
}
Mein Server hört auf den 4444-Port und decodiert das Gob richtig, aber wie kann ich die OK-Nachricht zurück ? Ich bin mit der Client-Adresse, dies zu tun (auf dem Server .GO-Datei):
con, err := net.Dial("udp", data.Addr)
Dann bekomme ich einen Fehlercode:
write udp 127.0.0.1:35290: connection refused
Wenn der Client versucht, mit dem Server zu verbinden sind Port 4444 erstellt der Client einen Port mit einer Zufallszahl (in diesem Fall 35290), damit sie kommunizieren können. Ich weiß, dass ich die Client-Adresse nicht an den Server weiterleiten sollte, aber conn.RemoteAddress() funktioniert nicht. Eine Lösung, die die Adresse des Kunden entdeckt, würde am meisten geschätzt werden.
Obs .: Ich weiß, dass es ReadFromUDP gibt, damit ich das Paket lesen kann. Soll ich die Adresse des Kunden lesen und die Daten an Gob senden, damit er sie entschlüsseln kann?
Read-Pakete unter Verwendung von [ReadFromUDP] (http://godoc.org/net#UDPConn.ReadFromUDP). Verwenden Sie die von ReadFromUDP zurückgegebene Adresse, um mit [WriteToUDP] (http://godoc.org/net#UDPConn.WriteToUDP) zu antworten. –
Ich habe darüber nachgedacht, aber wie würde Gob in dieser Situation passen? – Aleksandrus
Verschlüsseln Sie den Tropfen mit 'var b bytes.Buffer; err: = gob.NewEncoder (& b) .Encode (v) 'und schreibe b.Bytes() in die Verbindung. Dekodieren Sie die Gobs mit 'err: = gob.NewDecoder (bytes.NewReader (p)) .Decode (& v)' wobei p die Daten sind, die von der Verbindung gelesen werden. –