5.4 سرور udp مقدماتی

5.4 سرور udp مقدماتی

در این قسمت به طراحی و ساخت یک سرور UDP مقدماتی با گولنگ می پردازیم.

5.4.1 معرفی UDP #

پروتکل(User Datagram Protocol) یک پروتکل فاقد اتصال است. به این معنا که بسته های این پروتکل بدون اتصال قبلی و بررسی اینکه ایا همه بسته ها به درستی ارسال شده اند به دستگاه مورد نظر ارسال میشود. به همین دلیل سرعت در این پروتکل از پروتکل tcp پایین تر است اما تظمین ارسال کامل و سالم داده وجود ندارد. از موارد استفاده این پروتکل میتوان سرور بازی های انلاین را مثال زد.

5.4.2 پیاده سازی #

برای پیاده سازی یک سرور udp در گولنگ و اتصال به آن همچنان از کتابخانه net استفاده میکنیم.

 1package main
 2
 3import (
 4	"fmt"
 5	"net"
 6	"strings"
 7)
 8
 9
10func main() {
11  // ادرس IP و پورت مورد نظر را برای گوش سپردن به پکت های UDP مشخص میکنیم (مقدار بازگشتی این تابع اتصال ما است که قابلیت نوشتن و خواندن آن را داریم)
12	conn, err := net.ListenUDP("udp", &net.UDPAddr{
13		Port: 3000,
14		IP:   net.ParseIP("0.0.0.0"),
15	})
16	if err != nil {
17		panic(err)
18	}
19
20	defer conn.Close()
21	fmt.Printf("server listening %s\n", conn.LocalAddr().String())
22
23	for {
24		message := make([]byte, 20)
25    // تمام پیام های نوشته شده (ارسال شده) را میخوانیم 
26    // متغییر message را با مقدار ارسال شده پر میکنیم (مقدار های بازگشتی این تابع طول پیام و آدرس ریموت ارسال کننده است)
27		readLen, remote, err := conn.ReadFromUDP(message[:])
28		if err != nil {
29			panic(err)
30		}
31
32    // متن پیام را تا قسمت خوانده شده به string تبدیل میکنیم
33		data := strings.TrimSpace(string(message[:readLen]))
34    // داده خروجی را چاپ میکنیم
35		fmt.Printf("received: %s from %s\n", data, remote)
36	}
37}

بعد از انجام مراحل بالا با دستور ‍go run main.go کد خود را اجرا میکنیم.

5.4.3 کد کلاینت برای اتصال به سرور ساخته شده #

اکنون با چند خط کد در زبان گولنگ به سرور خود متصل میشویم پیامی را به آن ارسال میکنیم

 1package main
 2
 3import "net"
 4
 5func main() {
 6  // یک اتصال به سرور ایجاد میکنیم
 7  Conn, _ := net.DialUDP("udp", nil, &net.UDPAddr{IP:[]byte{127,0,0,1},Port:3000,Zone:""})
 8  
 9  defer Conn.Close()
10  // متن زیر را به سرور ارسال میکنیم
11  Conn.Write([]byte("hello, gofarsi!"))
12}

اکنون همزمان با اجرا بودن کد سرور این قطعه کد را با دستور ‍‍go run client.go اجرا میکنیم (بسته به اسمی که برای فایل انتخاب کرده اید)

خروجی در کنسول کد سرور به این صورت خواهد بود: received: hello, gofarsi! from 127.0.0.1:54960