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: 5-network/11-websocket/article.md
+19-19Lines changed: 19 additions & 19 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,25 +1,25 @@
1
1
# وب سوکت
2
2
3
-
پروتوکل _وب سوکت_, همانطور که در [RFC 6455](https://datatracker.ietf.org/doc/html/rfc6455) توضیحات آن ارائه شده است, راهی را برای ردوبدل کردن دیتا بین مرورگر و سرور به شکل یک ارتباط مستمر میسر میسازد. در این پروتوکل اطلاعات میتواندد بدون شکستن ارتباط و نیاز به درخواست HTTP اضافه به شکل دوسویه و در قالب "packets" رد و بدل شوند.
3
+
پروتوکل _وب سوکت_, همانطور که در [RFC 6455](https://datatracker.ietf.org/doc/html/rfc6455) توضیحات آن ارائه شده است, راهی را برای ردوبدل کردن دیتا بین مرورگر و سرور به شکل یک ارتباط مستمر میسر میسازد. در این پروتوکل اطلاعات میتوانند بدون شکستن ارتباط و نیاز به درخواست HTTP اضافه به شکل دوسویه و در قالب "packets" رد و بدل شوند.
4
4
5
5
به طور خاص وب سوکت برای سرویسهایی که نیاز به تبادل اطلاعات به شکل مستمر دارند مثل بازیهای آنلاین، سیستمهای ترید لحظهای و موارد مشابه استفاده میشود.
6
6
7
7
## یک مثال ساده
8
8
9
-
برای باز کردن یک ارتباط از نوع وب سوکت، ما نیاز به ایجاد یک `وب سوکت جدید` با استفاده از پروتوکل مخصوص `ws` در url داریم:
9
+
برای آغاز یک اتصال از نوع وب سوکت، ما نیاز به ایجاد یک `وب سوکت جدید` با استفاده از پروتوکل مخصوص `ws` در url داریم:
10
10
11
11
```js
12
12
let socket =newWebSocket("*!*ws*/!*://javascript.info");
13
13
```
14
14
15
15
همچنین پروتوکل رمزگذاری شده `//:wss` وجود دارد. این پروتوکل همانند پروتوکل HTTPS برای وب سوکت ها میباشد.
16
16
17
-
```smart header="Always prefer `wss://`"
18
-
پروتوکل`wss://` نه تنها رمزگذاری شده بلکه قابل اعتماد نیز هست
17
+
```smart header="است `wss://` همواره ترجیح براستفاده از پروتوکل"
18
+
پروتوکل`wss://` نه تنها رمزگذاری شده بلکه قابل اعتماد نیز هست
19
19
20
-
عدم رمزگذاری در ارتباط با پروتوکل `//:wss` باعث قابل رویت بودن اطلاعات توسط هر رابطی میشود. چون پروکسی سرورهای قدیمی راجع به وب سوکت ها اطلاعی ندارند ممکن است هدرها را "ناآشنا" تشخیص داده و ارتبط را قطع کنند.
20
+
عدم رمزگذاری در ارتباط با پروتوکل `//:ws` باعث قابل رویت بودن اطلاعات توسط هر رابطی میشود. چون پروکسی سرورهای قدیمی راجع به وب سوکت ها اطلاعی ندارند ممکن است هدرها را "ناآشنا" تشخیص داده و ارتبط را قطع کنند.
21
21
22
-
از طرف دیگر، پروتوکل `//:wss` برروی TLS بوده (همانطور که HTTPS همان HTTP برروی TLS میباشد.) لایه امنیت انتقال اطلاعات را از سمت فرستنده رمزگذاری کرده و در سمت گیرنده رمزگذاری میکند. بنابراین اطلاعات به شکل رمزگذاری شده از میان پروکسیها عبور میکنند. آنها نمیتوانند ببینند چه چیزی درون این بسته ها وجود دارد و تنها آنهارا عبور میدهند.
22
+
از طرف دیگر، پروتوکل `//:wss` برروی TLS بوده (همانطور که HTTPS همان HTTP برروی TLS میباشد.) لایه امنیت انتقال اطلاعات را از سمت فرستنده رمزگذاری کرده و در سمت گیرنده رمزگشایی میکند. بنابراین اطلاعات به شکل رمزگذاری شده از میان پروکسیها عبور میکنند. آنها نمیتوانند ببینند چه چیزی درون این بسته ها وجود دارد و تنها آنهارا عبور میدهند.
23
23
24
24
````
25
25
@@ -29,7 +29,7 @@ let socket = new WebSocket("*!*ws*/!*://javascript.info");
29
29
- **`error`** -- خطای وب سوکت,
30
30
- **`close`** -- بسته شدن ارتباط .
31
31
32
-
...و اگر بخواهیم چیزی ارسال کنیم آنگاه `socket.send(data)` اینکار را انجام خواهد داد.
32
+
...و اگر بخواهیم چیزی ارسال کنیم آنگاه `socket.send(data)` این کار را انجام خواهد داد.
زمانی که یک وب سوکت با دستور `new WebSocket(url)` ایجاد میشود, بلافاصله شروع به اتصال میکند.
75
75
76
-
درطول اتصال، مروگر (با استفاده از هدرها) از سرور سوال میکند: "آیا از وب سوکت پشتیبانی میکنی؟" و اگر سرور جواب مثبت بدهد، آنگاه مکالمه در پروتوکل وب سوکت ادامه مییابد که به هیچ وجه HTTP نیست.
76
+
درطول اتصال، مروگر (با استفاده از هدرها) از سرور سوال میکند: "آیا از وب سوکت پشتیبانی میکنی؟" و اگر سرور جواب مثبت بدهد، آنگاه مکالمه در پروتوکل وب سوکت ادامه مییابد که به اصلا HTTP نیست.
-`Origin` -- آدرس اصلی صفحه کلاینت، برای مثال `https://javascript.info`. آبجکتهای وب سوکت به ذاتا cross-origin هستند. هیچگونه هدر خاص یا محدودیتی در این رابطه وجود ندارد. چون سرورهای قدیمی قادر به کار کردن با وب سوکت نیستند, بنابراین هیچگونه مشکلی از نظر سازگاری وجود ندارد. اما هدر `Origin` از این نظر اهمیت دارد که به سرور اجازه میدهد درمورد ارتباط یا عدم ارتبط از طریق وب سوکت با این وبسایت تصمیم بگیرد.
92
+
-`Origin` --هستند. هیچ هدرخاص و یا دیگر محدودیتی وجود ندارد. درهرصورت سرورهای قدیمی قادر به کار با وب سوکت ها نیستند. بنابراین هیچگونه مشکل سازگاری وجود ندارد. اما این هدر مهم است چون به سرور این اجازه را میدهد تا درمورد ارتباط با وبسایت از طریق وب سوکت تصمیم بگیرد. cross-origin آبجکتهای وب سوکت ذاتا .`https://javascript.info` خواستگاه صفحه در سمت کلاینت برای مثال
-`Sec-WebSocket-Key` -- یک کلید تصادفی که توسط مرورگر ساخته میشود و برای اطمینان از اینکه آیا سرور از وب سوکت پشتیبانی میکند یا نه استفاده میشود. این کلید به صورت تصادفی است تا از cache کردن هر نوع ارتباطی توسط پروکسیها جلوگیری کند
اینجا `Sec-WebSocket-Accept` همان `Sec-WebSocket-Key` ای هست که توسط یک الگوریتم خاص دوباره کدگذاری شده است. با دیدن آن مرورگر متوجه میشود که سرور واقعا از پروتوکل وب سوکت پشتیبانی میکند
111
+
اینجا `Sec-WebSocket-Accept` همان `Sec-WebSocket-Key` ای هست که توسط یک الگوریتم خاص دوباره کدگذاری شده است. با دیدن آن، مرورگر متوجه میشود که سرور واقعا از پروتوکل وب سوکت پشتیبانی میکند
112
112
113
113
سپس اطلاعات بر بستر پروتوکل وب سوکت انتقال پیدا میکنند, که به زودی با ساختار آن ("frames") آشنا میشویم.
-`Sec-WebSocket-Extensions: deflate-frame` نمایانگر آن است که مروگر فشردهسازی اطلاعات را پشتیبانی میکند. یک extension به انتقال اطلاعات مرتبط است. سازوکاری که پروتوکل وب سوکت را گسترش میدهد. `Sec-WebSocket-Extensions: deflate-frame` به صورت خودکار توسط مروگر ارسال میشود و حاوی لیستی از همهی extension هایی که پشتیبانی میکند میباشد.
122
-
123
-
-`Sec-WebSocket-Protocol: soap, wamp` means that we'd like to transfer not just any data, but the data in [SOAP](https://en.wikipedia.org/wiki/SOAP) or WAMP ("The WebSocket Application Messaging Protocol") protocols. WebSocket subprotocols are registered in the [IANA catalogue](https://www.iana.org/assignments/websocket/websocket.xml). So, this header describes the data formats that we're going to use.
121
+
-`Sec-WebSocket-Extensions: deflate-frame` نمایانگر آن است که مروگر فشردهسازی اطلاعات را پشتیبانی میکند. یک افزونه به انتقال اطلاعات مرتبط است. سازوکاری که پروتوکل وب سوکت را گسترش میدهد. `Sec-WebSocket-Extensions: deflate-frame` به صورت خودکار توسط مروگر ارسال میشود و حاوی لیستی از همهی افزونه هایی که پشتیبانی میکند میباشد.
122
+
-`Sec-WebSocket-Protocol: soap, wamp` به این معنی است که ما نمیخواهیم هر دیتایی را ارسال کنیم بلکه دیتای در [SOAP](https://en.wikipedia.org/wiki/SOAP) یا WAMP ("پروتوکل پیامرسانی از طریق وب سوکت"). زیرپروتوکل های وب سوکت در [IANA catalogue](https://www.iana.org/assignments/websocket/websocket.xml) لیست شده اند. بنابراین این هدر فرمت دیتایی که میخواهیم استفاده کنیم را توصیف میکند.
124
123
125
124
این هدر اختیاری با استفاده از دومین پارامتر `new websocket` تنظیم میشود که آرایه ای از subprotocol هاست. برای مثال اگر بخواهیم از SOAP یا WAWP استفاده کنیم داریم:
126
125
@@ -181,6 +180,7 @@ Sec-WebSocket-Protocol: soap
181
180
که با مشخصه `socket.binaryType` قابل تنظیم بوده و به صورت پیشفرض `""blob""` است بنابراین دیتای باینری به شکل آبجکتهای `Blob` دریافت میشود.
182
181
183
182
[Blob](info:blob) is a high-level binary object, it directly integrates with `<a>`, `<img>` and other tags, so that's a sane default. But for binary processing, to access individual data bytes, we can change it to `"arraybuffer"`:
183
+
تغییر دهیم. `"arraybuffer"` و دیگر تگ ها ادغام میشود بنابراین مقدار پیشفرض منطقی خواهد بود. اما برای دیتای باینری میتوانیم آنرا به `<img>` و `<a>` آبجکت باینری سطح بالایی است که به صورت مستقیم با [Blob](info:blob)
184
184
185
185
```js
186
186
socket.binaryType="arraybuffer";
@@ -320,10 +320,10 @@ socket.onmessage = function (event) {
320
320
321
321
الگوریتم سمت سرور به اینصورت خواهد بود:
322
322
323
-
1. Create `clients = new Set()` -- a set of sockets.
324
-
2.For each accepted websocket, add it to the set `clients.add(socket)`and set `message` event listener to get its messages.
325
-
3.When a message is received: iterate over clients and send it to everyone.
326
-
4.When a connection is closed: `clients.delete(socket)`.
323
+
1. Create `clients = new Set()` --از سوکت ها set یک
324
+
2.تنظیم کنید event listener را برای دریافت پیامهای مربوط به `message` اضافه کرده و set به `clients.add(socket)`هر یک از وب سوکت های پذیرفته شده را با
325
+
3.زمانی که یک پیام دریافت میشود: بر روی کلاینتها پویش کرده و آنرا به همه ارسال کن
326
+
4.زمانی که یک اتصال بسته میشود: `clients.delete(socket)`
0 commit comments