เซิร์ฟเวอร์ของเล่น UDP และไคลเอนต์ใน Go ฉันทำสิ่งนี้เพื่อทำความคุ้นเคยกับแพ็คเกจมาตรฐานของ Go net
โดยเฉพาะฟังก์ชันที่เกี่ยวข้องกับ UDP
เนื่องจากฉันได้เรียนรู้ในขณะที่เขียน นี่เป็นรูปแบบที่ไม่ตรงกันแปลกๆ ระหว่างวิธีที่ server.go ทำซ็อกเก็ต UDP และวิธีที่ client.go ทำบางอย่างเกี่ยวกับซ็อกเก็ต "ทั่วไป" เพื่อปรับความไม่ตรงกันนี้ ฉันจึงใช้ client2.go โดยมีเพียงฟังก์ชัน UDP เพื่อจับคู่ server.go
ฉันยังเพิ่มไคลเอนต์ Python 3 ด้วยเพราะฉันไม่มีที่อื่นที่จะวางไว้
เซิร์ฟเวอร์รับฟังแพ็กเก็ต UDP บนหมายเลขพอร์ตเฉพาะ จะบล็อกการเรียกเมธอด net.ReadFromUDP()
หากเซิร์ฟเวอร์ได้รับไบต์ ระบบจะพิมพ์จำนวนไบต์ที่ได้รับจากที่ใด จากนั้นจึงเขียนจำนวนไบต์เท่าเดิมกลับไปยังที่ที่รับไบต์นั้น
ไคลเอนต์สร้างการเชื่อมต่อ UDP กับ IP บางตัว (v4 หรือ v6) หรือชื่อโฮสต์และหมายเลขพอร์ต โดยขึ้นอยู่กับข้อมูลบรรทัดคำสั่ง จากนั้นจะเขียนไบต์ของสตริงจากบรรทัดคำสั่งไปยังการเชื่อมต่อ UDP จะรอจนกว่าบางไบต์จะกลับมา หรือมีข้อผิดพลาดเกิดขึ้น แล้วมันก็มีอยู่
เรียบง่ายแต่เต็มไปด้วยปัญหา ไม่มีการหมดเวลา ไม่มีการกำหนดจำนวนไบต์ ไคลเอนต์หรือเซิร์ฟเวอร์อาจหยุดทำงานตลอดไปเพื่อรอแพ็กเก็ตที่ไม่เคยมาถึง
$ go build server.go
$ go build client.go
$ go build client2.go
ไคลเอนต์ python 3 ได้รับการตีความและไม่ต้องการ "การสร้าง"
ในหน้าต่าง 1:
$ ./server :: 7890
Accepting a new packet
ในหน้าต่าง 2:
$ ./client udp localhost 7890 'some string'
หรือ:
$ ./client2 fe80::a11:96ff:fe7f:6d74 7890 'some string' [eth0]
หรือ:
$ ./client1.py localhost 7890 'some string'
อาร์กิวเมนต์สุดท้ายของ ./client2
เป็นทางเลือก เป็นชื่อของอินเทอร์เฟซเครือข่ายสำหรับกำหนดเส้นทางแพ็กเก็ต สังเกตเนื้อหาของ net.UDPAddr
:
type UDPAddr struct {
IP IP
Port int
Zone string // IPv6 scoped addressing zone
}
องค์ประกอบโซนใช้สำหรับการกำหนดเส้นทางที่อยู่ลิงก์ท้องถิ่น (fe80: คำนำหน้า) ชื่ออินเทอร์เฟซทำงานเป็นโซน เรียกว่าด้วยอาร์กิวเมนต์ที่ 4 client2
ใช้อาร์กิวเมนต์นั้นเป็น "โซน"