Server dan klien UDP mainan di Go. Saya melakukan ini untuk mengenal paket standar Go net
, khususnya fungsi terkait UDP.
Karena saya belajar sambil menulis, inilah ketidakcocokan gaya yang aneh antara cara server.go mengerjakan soket UDP, dan bagaimana client.go mengerjakan beberapa hal soket "umum". Untuk mengatasi ketidakcocokan ini, saya melakukan client2.go hanya dengan fungsi UDP untuk mencocokkan server.go.
Saya juga menambahkan klien Python 3, karena saya tidak punya tempat lain untuk meletakkannya.
Server mendengarkan paket UDP pada nomor port tertentu. Ini memblokir panggilan metode net.ReadFromUDP()
.
Jika server menerima byte, server akan mencetak berapa banyak byte yang diterima dari mana, lalu menulis jumlah byte yang sama kembali ke mana pun server menerimanya.
Klien membuat koneksi UDP ke beberapa IP (v4 atau v6) atau nama host dan nomor port, berdasarkan informasi baris perintah. Kemudian ia menulis byte string, juga dari baris perintah, ke koneksi UDP. Ia menunggu hingga beberapa byte kembali ke sana, atau terjadi kesalahan. Maka itu ada.
Sederhana, namun penuh masalah. Tidak ada batas waktu, tidak ada jumlah byte yang ditentukan. Client atau server bisa hang selamanya menunggu paket yang tak kunjung tiba.
$ go build server.go
$ go build client.go
$ go build client2.go
Klien python 3 telah ditafsirkan dan tidak memerlukan "bangunan".
Di Jendela 1:
$ ./server :: 7890
Accepting a new packet
Di Jendela 2:
$ ./client udp localhost 7890 'some string'
Atau:
$ ./client2 fe80::a11:96ff:fe7f:6d74 7890 'some string' [eth0]
Atau:
$ ./client1.py localhost 7890 'some string'
Argumen terakhir dari ./client2
bersifat opsional. Itu adalah nama antarmuka jaringan untuk merutekan paket. Perhatikan isi net.UDPAddr
:
type UDPAddr struct {
IP IP
Port int
Zone string // IPv6 scoped addressing zone
}
Elemen Zone digunakan untuk merutekan alamat link-lokal (fe80: awalan). Nama antarmuka berfungsi sebagai zona. Dipanggil dengan argumen ke-4, client2
menggunakan argumen tersebut sebagai "zona".