You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: content/chapter 5/5.4-udp-server-begginer.md
+11-12Lines changed: 11 additions & 12 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -11,7 +11,7 @@ weight: 9004
11
11
پروتکل(User Datagram Protocol)
12
12
یک پروتکل {{< tooltip text="فاقد اتصال" note="connectionless" >}} است.
13
13
به این معنا که {{< tooltip text="بسته" note="packet" >}} های این پروتکل بدون اتصال قبلی و بررسی اینکه ایا همه بسته ها به درستی ارسال شده اند به دستگاه مورد نظر ارسال میشود.
14
-
به همین دلیل سرعت در این پروتکل از پروتکل tcp پایین تر است اما تظمین ارسال کامل و سالم داده وجود ندارد.
14
+
به همین دلیل سرعت در این پروتکل از پروتکل tcp بیشتر است اما تظمین ارسال کامل و سالم داده وجود ندارد.
15
15
از موارد استفاده این پروتکل میتوان سرور بازی های انلاین را مثال زد.
16
16
17
17
## 5.4.2 پیاده سازی
@@ -26,9 +26,8 @@ import (
26
26
"strings"
27
27
)
28
28
29
-
30
29
func main() {
31
-
// ادرس IP و پورت مورد نظر را برای گوش سپردن به پکت های UDP مشخص میکنیم (مقدار بازگشتی این تابع اتصال ما است که قابلیت نوشتن و خواندن آن را داریم)
30
+
// ادرس IP و پورت مورد نظر را برای گوش سپردن به پکت های UDP مشخص میکنیم (مقدار بازگشتی این تابع اتصال ما است که قابلیت نوشتن و خواندن آن را داریم)
32
31
conn, err := net.ListenUDP("udp", &net.UDPAddr{
33
32
Port: 3000,
34
33
IP: net.ParseIP("0.0.0.0"),
@@ -42,16 +41,16 @@ func main() {
42
41
43
42
for {
44
43
message := make([]byte, 20)
45
-
// تمام پیام های نوشته شده (ارسال شده) را میخوانیم
46
-
// متغییر message را با مقدار ارسال شده پر میکنیم (مقدار های بازگشتی این تابع طول پیام و آدرس ریموت ارسال کننده است)
44
+
// تمام پیام های نوشته شده (ارسال شده) را میخوانیم
45
+
// متغییر message را با مقدار ارسال شده پر میکنیم (مقدار های بازگشتی این تابع طول پیام و آدرس ریموت ارسال کننده است)
Copy file name to clipboardExpand all lines: content/chapter 5/5.7-http-server-advanced.md
+44Lines changed: 44 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -105,6 +105,50 @@ func main() {
105
105
}
106
106
{{< /play >}}
107
107
108
+
پیش از توضیح نحوه تست سرور http ایجاد شده، اجازه بدهید کمی درباره دو مفهوم
109
+
کلیدی Encode و Decode که در کد بالا آمده است و ممکن است برای کسانی که تازه وارد بحث
110
+
برنامه نویسی شبکه شده اند کمی گنگ باشد، توضیح بدهیم.
111
+
112
+
## توضیح Encode و Decode در کد
113
+
در کدی که نوشتیم، دو عمل خیلی مهم وجود دارد: Encode و Decode. اینها مسئول تبدیل دادهها بین دنیای Go و دنیای JSON هستند.
114
+
115
+
### Encode
116
+
هر وقت بخواهیم دادههای سمت سرور (مثل یک struct یا slice) را به صورت JSON برای کلاینت بفرستیم، از Encode استفاده میکنیم.
117
+
118
+
مثلاً در تابع getTodos:
119
+
120
+
```go
121
+
json.NewEncoder(w).Encode(todos)
122
+
```
123
+
124
+
اینجا متغیر todos (که یک slice از structهای Todo است) گرفته میشود و به یک رشته JSON تبدیل میشود. خروجی نهایی چیزی شبیه به این خواهد بود:
125
+
126
+
```json
127
+
[
128
+
{"id": 1, "title": "Learn Go", "status": false},
129
+
{"id": 2, "title": "Write Book", "status": true}
130
+
]
131
+
```
132
+
133
+
### Decode
134
+
وقتی کلاینت دادهای را به سرور میفرستد (مثلاً با متد POST یا PATCH)، دادهها معمولاً در قالب JSON ارسال میشوند. ما باید این JSON را به یک struct در Go تبدیل کنیم تا بتوانیم راحت با آن کار کنیم. اینجاست که Decode به کار میآید.
135
+
136
+
مثلاً در تابع addTodo:
137
+
138
+
```go
139
+
json.NewDecoder(r.Body).Decode(&todo)
140
+
```
141
+
142
+
اینجا بدنهی درخواست (r.Body) خوانده میشود و JSON داخل آن مثلاً:
143
+
144
+
```json
145
+
{"title": "Buy milk", "status": false}
146
+
```
147
+
148
+
به یک struct از نوع Todo تبدیل میشود و داخل متغیر todo قرار میگیرد.
149
+
150
+
## نحوه تست سرور http ایجاد شده
151
+
108
152
بعد از اتمام نوشتن سرور با استفاده از یک کلاینت `http` مثل postman سرور خود را به روش زیر تست میکنیم:
109
153
110
154
نکته: شما می توانید کلاینت خود را خودتان با استفاده از اموزش کلاینت http در قسمت های دیگر بنویسید!
0 commit comments