Skip to content

Commit a296f46

Browse files
committed
update article.md -- websocket
1 parent b24d8f5 commit a296f46

1 file changed

Lines changed: 19 additions & 19 deletions

File tree

5-network/11-websocket/article.md

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
# وب سوکت
22

3-
پروتوکل _وب‌ سوکت_, همانطور که در [RFC 6455](https://datatracker.ietf.org/doc/html/rfc6455) توضیحات آن ارائه شده است, راهی را برای ردوبدل کردن دیتا بین مرورگر و سرور به شکل یک ارتباط مستمر میسر میسازد. در این پروتوکل اطلاعات میتواندد بدون شکستن ارتباط و نیاز به درخواست HTTP اضافه به شکل دوسویه و در قالب "packets" رد و بدل شوند.
3+
پروتوکل _وب‌ سوکت_, همانطور که در [RFC 6455](https://datatracker.ietf.org/doc/html/rfc6455) توضیحات آن ارائه شده است, راهی را برای ردوبدل کردن دیتا بین مرورگر و سرور به شکل یک ارتباط مستمر میسر میسازد. در این پروتوکل اطلاعات میتوانند بدون شکستن ارتباط و نیاز به درخواست HTTP اضافه به شکل دوسویه و در قالب "packets" رد و بدل شوند.
44

55
به طور خاص وب سوکت برای سرویس‌هایی که نیاز به تبادل اطلاعات به شکل مستمر دارند مثل بازیهای آنلاین، سیستم‌های ترید لحظه‌ای و موارد مشابه استفاده می‌شود.
66

77
## یک مثال ساده
88

9-
برای باز کردن یک ارتباط از نوع وب سوکت، ما نیاز به ایجاد یک `وب سوکت جدید` با استفاده از پروتوکل مخصوص `ws` در url داریم:
9+
برای آغاز یک اتصال از نوع وب سوکت، ما نیاز به ایجاد یک `وب سوکت جدید` با استفاده از پروتوکل مخصوص `ws` در url داریم:
1010

1111
```js
1212
let socket = new WebSocket("*!*ws*/!*://javascript.info");
1313
```
1414

1515
همچنین پروتوکل رمزگذاری شده `//:wss` وجود دارد. این پروتوکل همانند پروتوکل HTTPS برای وب سوکت ها میباشد.
1616

17-
```smart header="Always prefer `wss://`"
18-
پروتوکل `wss://` نه تنها رمزگذاری شده بلکه قابل اعتماد نیز هست
17+
```smart header="است `wss://` همواره ترجیح براستفاده از پروتوکل"
18+
پروتوکل`wss://` نه تنها رمزگذاری شده بلکه قابل اعتماد نیز هست
1919

20-
عدم رمزگذاری در ارتباط با پروتوکل `//:wss` باعث قابل رویت بودن اطلاعات توسط هر رابطی میشود. چون پروکسی سرورهای قدیمی راجع به وب سوکت ها اطلاعی ندارند ممکن است هدرها را "ناآشنا" تشخیص داده و ارتبط را قطع کنند.
20+
عدم رمزگذاری در ارتباط با پروتوکل `//:ws` باعث قابل رویت بودن اطلاعات توسط هر رابطی میشود. چون پروکسی سرورهای قدیمی راجع به وب سوکت ها اطلاعی ندارند ممکن است هدرها را "ناآشنا" تشخیص داده و ارتبط را قطع کنند.
2121

22-
از طرف دیگر، پروتوکل `//:wss` برروی TLS بوده (همانطور که HTTPS همان HTTP برروی TLS میباشد.) لایه امنیت انتقال اطلاعات را از سمت فرستنده رمزگذاری کرده و در سمت گیرنده رمزگذاری میکند. بنابراین اطلاعات به شکل رمزگذاری شده از میان پروکسی‌ها عبور میکنند. آنها نمیتوانند ببینند چه چیزی درون این بسته ها وجود دارد و تنها آنهارا عبور میدهند.
22+
از طرف دیگر، پروتوکل `//:wss` برروی TLS بوده (همانطور که HTTPS همان HTTP برروی TLS میباشد.) لایه امنیت انتقال اطلاعات را از سمت فرستنده رمزگذاری کرده و در سمت گیرنده رمزگشایی میکند. بنابراین اطلاعات به شکل رمزگذاری شده از میان پروکسی‌ها عبور میکنند. آنها نمیتوانند ببینند چه چیزی درون این بسته ها وجود دارد و تنها آنهارا عبور میدهند.
2323

2424
````
2525
@@ -29,7 +29,7 @@ let socket = new WebSocket("*!*ws*/!*://javascript.info");
2929
- **`error`** -- خطای وب سوکت,
3030
- **`close`** -- بسته شدن ارتباط .
3131
32-
...و اگر بخواهیم چیزی ارسال کنیم آنگاه `socket.send(data)` اینکار را انجام خواهد داد.
32+
...و اگر بخواهیم چیزی ارسال کنیم آنگاه `socket.send(data)` این کار را انجام خواهد داد.
3333
3434
یک مثال:
3535
@@ -50,8 +50,8 @@ socket.onclose = function(event) {
5050
if (event.wasClean) {
5151
alert(`[close] Connection closed cleanly, code=${event.code} reason=${event.reason}`);
5252
} else {
53-
// e.g. server process killed or network down
54-
// event.code is usually 1006 in this case
53+
// برای مثال عملیات سمت سرور به مشکل خورده و یا شبکه از کار افتاده است
54+
// در این موقعیت event.code عدد 1006 است.
5555
alert('[close] Connection died');
5656
}
5757
};
@@ -73,7 +73,7 @@ socket.onerror = function(error) {
7373

7474
زمانی که یک وب سوکت با دستور `new WebSocket(url)` ایجاد می‌شود, بلافاصله شروع به اتصال میکند.
7575

76-
درطول اتصال، مروگر (با استفاده از هدرها) از سرور سوال میکند: "آیا از وب سوکت پشتیبانی میکنی؟" و اگر سرور جواب مثبت بدهد، آنگاه مکالمه در پروتوکل وب سوکت ادامه می‌یابد که به هیچ وجه HTTP نیست.
76+
درطول اتصال، مروگر (با استفاده از هدرها) از سرور سوال میکند: "آیا از وب سوکت پشتیبانی میکنی؟" و اگر سرور جواب مثبت بدهد، آنگاه مکالمه در پروتوکل وب سوکت ادامه می‌یابد که به اصلا HTTP نیست.
7777

7878
![](websocket-handshake.svg)
7979

@@ -89,7 +89,7 @@ Sec-WebSocket-Key: Iv8io/9s+lYFgZWcXczP8Q==
8989
Sec-WebSocket-Version: 13
9090
```
9191

92-
- `Origin` -- آدرس اصلی صفحه کلاینت، برای مثال `https://javascript.info`. آبجکت‌های وب سوکت به ذاتا cross-origin هستند. هیچگونه هدر خاص یا محدودیتی در این رابطه وجود ندارد. چون سرورهای قدیمی قادر به کار کردن با وب سوکت نیستند, بنابراین هیچگونه مشکلی از نظر سازگاری وجود ندارد. اما هدر `Origin` از این نظر اهمیت دارد که به سرور اجازه میدهد درمورد ارتباط یا عدم ارتبط از طریق وب سوکت با این وب‌سایت تصمیم بگیرد.
92+
- `Origin` --هستند. هیچ هدرخاص و یا دیگر محدودیتی وجود ندارد. درهرصورت سرورهای قدیمی قادر به کار با وب سوکت ها نیستند. بنابراین هیچگونه مشکل سازگاری وجود ندارد. اما این هدر مهم است چون به سرور این اجازه را میدهد تا درمورد ارتباط با وبسایت از طریق وب سوکت تصمیم بگیرد. cross-origin آبجکت‌های وب سوکت ذاتا .`https://javascript.info` خواستگاه صفحه در سمت کلاینت برای مثال
9393
- `Connection: Upgrade` -- علامتی نمایانگر آنکه کلاینت خواهان تغییر پروتوکل میباشد.
9494
- `Upgrade: websocket` -- پروتوکل درخواستی "وب سوکت" میباشد
9595
- `Sec-WebSocket-Key` -- یک کلید تصادفی که توسط مرورگر ساخته میشود و برای اطمینان از اینکه آیا سرور از وب سوکت پشتیبانی میکند یا نه استفاده میشود. این کلید به صورت تصادفی است تا از cache کردن هر نوع ارتباطی توسط پروکسی‌ها جلوگیری کند
@@ -108,7 +108,7 @@ Connection: Upgrade
108108
Sec-WebSocket-Accept: hsBlbuDTkk24srzEOTBUlZAlC2g=
109109
```
110110

111-
اینجا `Sec-WebSocket-Accept` همان `Sec-WebSocket-Key` ای هست که توسط یک الگوریتم خاص دوباره کدگذاری شده است. با دیدن آن مرورگر متوجه میشود که سرور واقعا از پروتوکل وب سوکت پشتیبانی میکند
111+
اینجا `Sec-WebSocket-Accept` همان `Sec-WebSocket-Key` ای هست که توسط یک الگوریتم خاص دوباره کدگذاری شده است. با دیدن آن، مرورگر متوجه میشود که سرور واقعا از پروتوکل وب سوکت پشتیبانی میکند
112112

113113
سپس اطلاعات بر بستر پروتوکل وب سوکت انتقال پیدا میکنند, که به زودی با ساختار آن ("frames") آشنا میشویم.
114114

@@ -118,9 +118,8 @@ Sec-WebSocket-Accept: hsBlbuDTkk24srzEOTBUlZAlC2g=
118118

119119
برای مثال:
120120

121-
- `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) لیست شده اند. بنابراین این هدر فرمت دیتایی که میخواهیم استفاده کنیم را توصیف میکند.
124123

125124
این هدر اختیاری با استفاده از دومین پارامتر `new websocket` تنظیم میشود که آرایه ای از subprotocol هاست. برای مثال اگر بخواهیم از SOAP یا WAWP استفاده کنیم داریم:
126125

@@ -181,6 +180,7 @@ Sec-WebSocket-Protocol: soap
181180
که با مشخصه `socket.binaryType` قابل تنظیم بوده و به صورت پیشفرض `""blob""` است بنابراین دیتای باینری به شکل آبجکت‌های `Blob` دریافت می‌شود.
182181

183182
[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)
184184

185185
```js
186186
socket.binaryType = "arraybuffer";
@@ -320,10 +320,10 @@ socket.onmessage = function (event) {
320320

321321
الگوریتم سمت سرور به اینصورت خواهد بود:
322322

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)`
327327

328328
```js
329329
const ws = new require("ws");

0 commit comments

Comments
 (0)