Schreiben Client UDP-Socket-in Gehen

Ich bin auf der Suche nach einer guten Lösung für eine client/server-Kommunikation mit UDP-sockets in Go Sprache.

Die Beispiele, die ich im Internet gefunden die mir zeigen, wie Daten an den server senden, aber Sie nicht lehren, wie Sie zu senden an den client zurück.

Demonstrieren, mein Programm macht Folgendes:

Mein client-Programm erzeugt einen socket auf den port 4444, so wie hier:

con, err := net.Dial("udp", "127.0.0.1:4444")

Ich eine Zeichenfolge gesendet und der lokalen Adresse auf dem server, so könnte es drucken Sie den string und senden einer OK-Meldung. Ich bin mit gob für diese:

enc := gob.NewEncoder(con)
enc.Encode(Data{"test", con.LocalAddr().String()})

Meine Daten struct sieht wie folgt aus:

type Data struct{
    Msg string
    Addr string
}

Meinem server lauscht auf dem port 4444 und decodiert die Klappe richtig, aber wie kann ich senden Sie die OK-Meldung zurück? Ich bin mit der client-Adresse zu tun (auf dem server .go-Datei):

con, err := net.Dial("udp", data.Addr)

Dann bekomme ich einen Fehler-code:

write udp 127.0.0.1:35290: connection refused

Wenn der client versucht, eine Verbindung zu dem Server-port 4444, erstellt der client einen port mit einer zufälligen Zahl (in diesem Fall, 35290), so dass Sie kommunizieren können. Ich weiß, ich sollte nicht sein, vorbei die Adresse des Clients an den server, aber conn.RemoteAddress() funktioniert nicht. Eine Lösung, welche die client-Adresse würde am meisten geschätzt.

Obs.: Ich weiß, es ist ReadFromUDP, so kann ich Lesen Sie die Packungsbeilage. Sollte ich es Lesen, entdecken Sie die client-Adresse, und senden die Daten an Gob, damit er Sie entschlüsseln kann?

  • Lesen Sie Pakete, die mit ReadFromUDP. Verwenden Sie die Adresse zurückgegeben, die von ReadFromUDP Antworten mit WriteToUDP.
  • Ich war darüber nachzudenken, aber wie würde die Klappe passen in dieser situation?
  • Kodieren Sie die Klappe, um einen Puffer mit var b bytes.Buffer; err := gob.NewEncoder(&b).Encode(v) und schreiben b.Byte (), um die Verbindung. Decodieren der gobs mit err := gob.NewDecoder(bytes.NewReader(p)).Decode(&v) wobei p die gelesenen Daten aus der Verbindung.
InformationsquelleAutor Aleksandrus | 2014-09-25
Schreibe einen Kommentar