وبسوکت شبکه net/websocket
اتصال دوطرفهی همیشهباز میان مرورگر و سرور، با اتاقها برای پخش پیام.
واردسازی شبکه.وبسوکت شبکه
وبسوکت اتصالی است که پس از یک درخواست HTTP باز میماند و هر دو طرف هر وقت خواستند پیام میفرستند؛ برای گفتگوی زنده، اعلانها و بازیها. سرور با شنود و پذیرش اتصال میگیرد و کارخواه با شماره گیری وصل میشود.
برای ادارهی چند کارخواه، هر اتصال را در یک نخ جدا بخوانید و با هاب پیام را به همهی اعضای یک اتاق بفرستید.
گونهها
سرور Server
ساختار سرور| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| fd | fd | صحیح۶۴ = -1 | شناسهی سوکت. |
| port | port | صحیح = 0 | درگاه. |
واردسازی شبکه.وبسوکت شبکه
ناپایا سرور := وبسوکت شبکه.سرور {}
روال پاسخگو():
ناپایا ا := وبسوکت شبکه.پذیرش(سرور)
تا وبسوکت شبکه.باز است(ا):
پ := وبسوکت شبکه.دریافت پیام(ا)
اگر وبسوکت شبکه.متن است(پ):
_ := وبسوکت شبکه.ارسال متن(ا، "پژواک: " + پ.text)
وگرنه وبسوکت شبکه.دودویی است(پ):
_ := وبسوکت شبکه.ارسال بایت دودویی(ا، پ.data، پ.len)
وگرنه وبسوکت شبکه.بسته است(پ):
بشکن
پایان
پایان
وبسوکت شبکه.بستن(ا)
پایان
روال ریشه:
سرور = وبسوکت شبکه.شنود(۰)
سرچاپ وبسوکت شبکه.معتبر(سرور)، وبسوکت شبکه.درگاه(سرور) > ۰
ن := spawn(پاسخگو)
ناپایا ک := وبسوکت شبکه.شماره گیری("127.0.0.1"، وبسوکت شبکه.درگاه(سرور)، "/chat")
سرچاپ وبسوکت شبکه.باز است(ک)، ک.path، ک.client
_ := وبسوکت شبکه.ارسال متن(ک، "سلام")
سرچاپ وبسوکت شبکه.دریافت متن(ک)
_ := وبسوکت شبکه.ارسال دودویی(ک، "abc")
پ := وبسوکت شبکه.دریافت با مهلت(ک، ۲۰۰۰)
سرچاپ پ.kind == وبسوکت شبکه.دودویی، پ.len
_ := وبسوکت شبکه.پینگ فرست(ک، "p")
پ۲ := وبسوکت شبکه.دریافت با مهلت(ک، ۲۰۰۰)
سرچاپ وبسوکت شبکه.پونگ است(پ۲)، پ۲.kind == وبسوکت شبکه.پونگ
پ۳ := وبسوکت شبکه.دریافت با مهلت(ک، ۵۰)
سرچاپ پ۳.kind == وبسوکت شبکه.مهلت
وبسوکت شبکه.بستن(ک)
join(ن)
وبسوکت شبکه.بستن سرور(سرور)
سرچاپ وبسوکت شبکه.هیچ، وبسوکت شبکه.متن، وبسوکت شبکه.بسته، وبسوکت شبکه.پینگ
پایاناتصال وب Conn
ساختار اتصال وب| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| fd | fd | صحیح۶۴ = -1 | شناسهی سوکت. |
| open | open | منطقی = نادرست | اتصال باز است. |
| path | path | رشته = "" | مسیر درخواستشده، مثل /chat. |
| client | client | منطقی = نادرست | این سمت کارخواه است؛ کارخواه قابها را پوشانده میفرستد. |
| buf | buf | تهی* | بافر دریافت. |
| blen | blen | صحیح = 0 | طول دادهی بافر. |
| bcap | bcap | صحیح = 0 | ظرفیت بافر. |
| secure | secure | منطقی = نادرست | رمزشده است. |
| tls_idx | tls_idx | صحیح = -1 | شناسهی درونی TLS. |
| hdr | hdr | رشته = "" | سرآیندهای دست دادن. |
| acc | acc | رشته = "" | متن پیام چندقابی در حال جمع شدن. |
| acc_kind | acc_kind | صحیح = 0 | نوع پیام چندقابی. |
| fragmented | fragmented | منطقی = نادرست | پیام چندقابی در راه است. |
| bin | bin | تهی* | بافر پیام دودویی. |
| binlen | binlen | صحیح = 0 | طول آن. |
| bincap | bincap | صحیح = 0 | ظرفیت آن. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
پیام Message
ساختار پیام| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| kind | kind | صحیح = 0 | نوع پیام؛ یکی از ثابتهای بالا. |
| text | text | رشته = "" | متن پیام متنی. |
| data | data | تهی* | دادهی پیام دودویی. |
| len | len | صحیح = 0 | طول داده. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
اعضای اتاق RoomMembers
ساختار اعضای اتاق| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| items | items | وکتور<اتصال وب> | اتصالها. |
واردسازی شبکه.وبسوکت شبکه
ناپایا سرور := وبسوکت شبکه.سرور {}
ناپایا طرفها := وکتور {} برگردان وکتور<وبسوکت شبکه.اتصال وب>
روال پذیرنده():
تکرار ۲:
طرفها.بیفزا(وبسوکت شبکه.پذیرش(سرور))
پایان
پایان
روال ریشه:
سرور = وبسوکت شبکه.شنود(۰)
د := وبسوکت شبکه.درگاه(سرور)
ن := spawn(پذیرنده)
ناپایا الف := وبسوکت شبکه.شماره گیری("127.0.0.1"، د، "/room")
ناپایا ب := وبسوکت شبکه.شماره گیری با سربرگ("127.0.0.1"، د، "/room"، "X-Name: b\r\n")
join(ن)
ناپایا هاب := وبسوکت شبکه.هاب جدید()
هر ط در طرفها:
وبسوکت شبکه.ثبت(هاب، "lobby"، ط)
پایان
سرچاپ وبسوکت شبکه.اندازه اتاق(هاب، "lobby")، هاب.rooms.اندازه()
سرچاپ وبسوکت شبکه.پخش(هاب، "lobby"، "خوش آمدید")
سرچاپ وبسوکت شبکه.دریافت متن(الف)، وبسوکت شبکه.دریافت متن(ب)
سرچاپ وبسوکت شبکه.پخش دودویی(هاب، "lobby"، "xy")
سرچاپ وبسوکت شبکه.دریافت پیام(الف).len
وبسوکت شبکه.لغو ثبت(هاب، "lobby"، طرفها[۰])
سرچاپ وبسوکت شبکه.اندازه اتاق(هاب، "lobby")
وبسوکت شبکه.توقف(الف)
وبسوکت شبکه.بستن(ب)
وبسوکت شبکه.بستن سرور(سرور)
پایانهاب Hub
ساختار هاب| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| rooms | rooms | نگاشت<رشته، اعضای اتاق> | اتاقها و اعضایشان. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Hub.salam
پایاها و متغیرها
هیچ NONE
پایا هیچ: صحیح۳۲ = 0نمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
متن TEXT
پایا متن: صحیح۳۲ = 1نمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
دودویی BINARY
پایا دودویی: صحیح۳۲ = 2نمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
بسته CLOSE
پایا بسته: صحیح۳۲ = 8نمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
پینگ PING
پایا پینگ: صحیح۳۲ = 9نمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
پونگ PONG
پایا پونگ: صحیح۳۲ = 10نمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
مهلت TIMEOUT
پایا مهلت: صحیح۳۲ = 100نمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
روالها
کلید پذیرش AcceptKey
روال کلید پذیرش(key: رشته): رشتهواردسازی شبکه.وبسوکت شبکه
واردسازی رشته
روال ریشه:
سرچاپ وبسوکت شبکه.کلید پذیرش("dGhlIHNhbXBsZSBub25jZQ==")
د := وبسوکت شبکه.درخواست دست دادن("example.com"، "/chat"، "dGhlIHNhbXBsZSBub25jZQ==")
سرچاپ رشته.تفکیک کردن(د، "\r\n")[۰]
د۲ := وبسوکت شبکه.درخواست دست دادن با سربرگ("example.com"، "/chat"، "dGhlIHNhbXBsZSBub25jZQ=="، "Authorization: Bearer x\r\n")
سرچاپ رشته.شامل است(د۲، "Authorization: Bearer x")
پ := وبسوکت شبکه.پاسخ دست دادن(د)
سرچاپ رشته.تفکیک کردن(پ، "\r\n")[۰]
سرچاپ رشته.شامل است(پ، "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=")
پایانپاسخ دست دادن HandshakeResponse
روال پاسخ دست دادن(request: رشته): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Handshake.salam
درخواست دست دادن HandshakeRequest
روال درخواست دست دادن(host: رشته، path: رشته، key: رشته): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Handshake.salam
درخواست دست دادن با سربرگ HandshakeRequestWith
روال درخواست دست دادن با سربرگ(host: رشته، path: رشته، key: رشته، extra: رشته): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Handshake.salam
شنود Listen
روال شنود(port: صحیح): سرورنمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
معتبر Ok
روال معتبر(srv: سرور): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
درگاه Port
روال درگاه(srv: سرور): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
بستن سرور CloseServer
روال بستن سرور(srv: سرور)نمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
پذیرش Accept
روال پذیرش(srv: سرور): اتصال وبنمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
بارگذاری پیکربندی امن LoadWSSConfig
روال بارگذاری پیکربندی امن(cert_file: رشته، key_file: رشته)واردسازی شبکه.وبسوکت شبکه
روال ریشه:
ناپایا ک := وبسوکت شبکه.شماره گیری امن("echo.example.com"، ۴۴۳، "/")
ناپایا ک۲ := وبسوکت شبکه.شماره گیری امن با سربرگ("echo.example.com"، ۴۴۳، "/"، "Origin: https://salamlang.ir\r\n")
ناپایا ک۳ := وبسوکت شبکه.شماره گیری امن بدون بررسی("localhost"، ۸۴۴۳، "/"، "")
سرچاپ وبسوکت شبکه.باز است(ک)، وبسوکت شبکه.باز است(ک۲)، وبسوکت شبکه.باز است(ک۳)
وبسوکت شبکه.بارگذاری پیکربندی امن("cert.pem"، "key.pem")
س := وبسوکت شبکه.شنود(۸۴۴۳)
ناپایا ا := وبسوکت شبکه.پذیرش امن(س)
_ := وبسوکت شبکه.ارسال متن(ا، "سلام")
وبسوکت شبکه.بستن(ا)
پایانپذیرش امن AcceptWSS
روال پذیرش امن(srv: سرور): اتصال وبنمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-WSS.salam
شماره گیری Dial
روال شماره گیری(host: رشته، port: صحیح، path: رشته): اتصال وبنمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
شماره گیری با سربرگ DialWith
روال شماره گیری با سربرگ(host: رشته، port: صحیح، path: رشته، extra: رشته): اتصال وب\r\n تمام شود.نمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Hub.salam
شماره گیری امن DialWSS
روال شماره گیری امن(host: رشته، port: صحیح، path: رشته): اتصال وبنمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-WSS.salam
شماره گیری امن با سربرگ DialWSSWith
روال شماره گیری امن با سربرگ(host: رشته، port: صحیح، path: رشته، extra: رشته): اتصال وبنمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-WSS.salam
شماره گیری امن بدون بررسی DialWSSUnverified
روال شماره گیری امن بدون بررسی(host: رشته، port: صحیح، path: رشته، extra: رشته): اتصال وبنمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-WSS.salam
باز است IsOpen
روال باز است(c &: اتصال وب): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
دریافت پیام Receive
روال دریافت پیام(c &: اتصال وب): پیامنمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
دریافت با مهلت Poll
روال دریافت با مهلت(c &: اتصال وب، timeout_ms: صحیح): پیامنمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
دریافت متن ReceiveText
روال دریافت متن(c &: اتصال وب): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
متن است IsText
روال متن است(m: پیام): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
دودویی است IsBinary
روال دودویی است(m: پیام): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
بسته است IsClose
روال بسته است(m: پیام): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
پونگ است IsPong
روال پونگ است(m: پیام): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
ارسال متن SendText
روال ارسال متن(c &: اتصال وب، msg: رشته): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
ارسال دودویی SendBinary
روال ارسال دودویی(c &: اتصال وب، data: رشته): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
ارسال بایت دودویی SendBinaryBytes
روال ارسال بایت دودویی(c &: اتصال وب، ptr: تهی*، n: صحیح): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
پینگ فرست Ping
روال پینگ فرست(c &: اتصال وب، data: رشته): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
بستن Close
روال بستن(c &: اتصال وب)نمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam
توقف Stop
روال توقف(c &: اتصال وب)نمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Hub.salam
هاب جدید NewHub
روال هاب جدید(): هابنمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Hub.salam
ثبت Register
روال ثبت(h &: هاب، room: رشته، c: اتصال وب)نمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Hub.salam
لغو ثبت Unregister
روال لغو ثبت(h &: هاب، room: رشته، c: اتصال وب)نمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Hub.salam
اندازه اتاق RoomSize
روال اندازه اتاق(h: هاب، room: رشته): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Hub.salam
پخش Broadcast
روال پخش(h &: هاب، room: رشته، msg: رشته): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Hub.salam
پخش دودویی BroadcastBinary
روال پخش دودویی(h &: هاب، room: رشته، data: رشته): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-websocket-Hub.salam