کتابخانه‌ی استاندارد · شبکه

وب‌سوکت شبکه net/websocket

اتصال دوطرفه‌ی همیشه‌باز میان مرورگر و سرور، با اتاق‌ها برای پخش پیام.

واردسازی شبکه.وب‌سوکت شبکه

وب‌سوکت اتصالی است که پس از یک درخواست HTTP باز می‌ماند و هر دو طرف هر وقت خواستند پیام می‌فرستند؛ برای گفتگوی زنده، اعلان‌ها و بازی‌ها. سرور با شنود و پذیرش اتصال می‌گیرد و کارخواه با شماره گیری وصل می‌شود.

برای اداره‌ی چند کارخواه، هر اتصال را در یک نخ جدا بخوانید و با هاب پیام را به همه‌ی اعضای یک اتاق بفرستید.

گونه‌ها

سرور Server

ساختار سرور
سرور وب‌سوکت.
نامانگلیسیگونهتوضیح
fdfdصحیح۶۴ = -1شناسه‌ی سوکت.
portportصحیح = 0درگاه.
net-websocket-Echo.salam
واردسازی شبکه.وب‌سوکت شبکه

ناپایا سرور := وب‌سوکت شبکه.سرور {}

روال پاسخ‌گو():
    ناپایا ا := وب‌سوکت شبکه.پذیرش(سرور)
    تا وب‌سوکت شبکه.باز است(ا):
        پ := وب‌سوکت شبکه.دریافت پیام(ا)
        اگر وب‌سوکت شبکه.متن است(پ):
            _ := وب‌سوکت شبکه.ارسال متن(ا، "پژواک: " + پ.text)
        وگرنه وب‌سوکت شبکه.دودویی است(پ):
            _ := وب‌سوکت شبکه.ارسال بایت دودویی(ا، پ.data، پ.len)
        وگرنه وب‌سوکت شبکه.بسته است(پ):
            بشکن
        پایان
    پایان
    وب‌سوکت شبکه.بستن(ا)
پایان

روال ریشه:
    سرور = وب‌سوکت شبکه.شنود(۰)
    سرچاپ وب‌سوکت شبکه.معتبر(سرور)، وب‌سوکت شبکه.درگاه(سرور) > ۰
    ن := spawn(پاسخ‌گو)
    ناپایا ک := وب‌سوکت شبکه.شماره گیری("127.0.0.1"، وب‌سوکت شبکه.درگاه(سرور)، "/chat")
    سرچاپ وب‌سوکت شبکه.باز است(ک)، ک.path، ک.client
    _ := وب‌سوکت شبکه.ارسال متن(ک، "سلام")
    سرچاپ وب‌سوکت شبکه.دریافت متن(ک)
    _ := وب‌سوکت شبکه.ارسال دودویی(ک، "abc")
    پ := وب‌سوکت شبکه.دریافت با مهلت(ک، ۲۰۰۰)
    سرچاپ پ.kind == وب‌سوکت شبکه.دودویی، پ.len
    _ := وب‌سوکت شبکه.پینگ فرست(ک، "p")
    پ۲ := وب‌سوکت شبکه.دریافت با مهلت(ک، ۲۰۰۰)
    سرچاپ وب‌سوکت شبکه.پونگ است(پ۲)، پ۲.kind == وب‌سوکت شبکه.پونگ
    پ۳ := وب‌سوکت شبکه.دریافت با مهلت(ک، ۵۰)
    سرچاپ پ۳.kind == وب‌سوکت شبکه.مهلت
    وب‌سوکت شبکه.بستن(ک)
    join(ن)
    وب‌سوکت شبکه.بستن سرور(سرور)
    سرچاپ وب‌سوکت شبکه.هیچ، وب‌سوکت شبکه.متن، وب‌سوکت شبکه.بسته، وب‌سوکت شبکه.پینگ
پایان
خروجیtrue true true /chat true پژواک: سلام true 3 true true true 0 1 8 9

اتصال وب Conn

ساختار اتصال وب
یک اتصال وب‌سوکت، در سمت سرور یا کارخواه.
نامانگلیسیگونهتوضیح
fdfdصحیح۶۴ = -1شناسه‌ی سوکت.
openopenمنطقی = نادرستاتصال باز است.
pathpathرشته = ""مسیر درخواست‌شده، مثل /chat.
clientclientمنطقی = نادرستاین سمت کارخواه است؛ کارخواه قاب‌ها را پوشانده می‌فرستد.
bufbufتهی*بافر دریافت.
blenblenصحیح = 0طول داده‌ی بافر.
bcapbcapصحیح = 0ظرفیت بافر.
securesecureمنطقی = نادرسترمزشده است.
tls_idxtls_idxصحیح = -1شناسه‌ی درونی TLS.
hdrhdrرشته = ""سرآیندهای دست دادن.
accaccرشته = ""متن پیام چندقابی در حال جمع شدن.
acc_kindacc_kindصحیح = 0نوع پیام چندقابی.
fragmentedfragmentedمنطقی = نادرستپیام چندقابی در راه است.
binbinتهی*بافر پیام دودویی.
binlenbinlenصحیح = 0طول آن.
bincapbincapصحیح = 0ظرفیت آن.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam

پیام Message

ساختار پیام
یک پیام دریافتی.
نامانگلیسیگونهتوضیح
kindkindصحیح = 0نوع پیام؛ یکی از ثابت‌های بالا.
texttextرشته = ""متن پیام متنی.
datadataتهی*داده‌ی پیام دودویی.
lenlenصحیح = 0طول داده.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-websocket-Echo.salam

اعضای اتاق RoomMembers

ساختار اعضای اتاق
اعضای یک اتاق.
نامانگلیسیگونهتوضیح
itemsitemsوکتور<اتصال وب>اتصال‌ها.
net-websocket-Hub.salam
واردسازی شبکه.وب‌سوکت شبکه

ناپایا سرور := وب‌سوکت شبکه.سرور {}
ناپایا طرف‌ها := وکتور {} برگردان وکتور<وب‌سوکت شبکه.اتصال وب>

روال پذیرنده():
    تکرار ۲:
        طرف‌ها.بیفزا(وب‌سوکت شبکه.پذیرش(سرور))
    پایان
پایان

روال ریشه:
    سرور = وب‌سوکت شبکه.شنود(۰)
    د := وب‌سوکت شبکه.درگاه(سرور)
    ن := 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")
    وب‌سوکت شبکه.توقف(الف)
    وب‌سوکت شبکه.بستن(ب)
    وب‌سوکت شبکه.بستن سرور(سرور)
پایان
خروجی2 1 2 خوش آمدید خوش آمدید 2 2 1

هاب Hub

ساختار هاب
هاب: اتصال‌ها را در اتاق‌ها گروه می‌کند تا یک پیام به همه‌ی اعضای اتاق برسد؛ برای گفتگو.
نامانگلیسیگونهتوضیح
roomsroomsنگاشت<رشته، اعضای اتاق>اتاق‌ها و اعضایشان.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: 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: رشته): رشته
کلید پذیرش دست دادن را از کلید کارخواه می‌سازد (RFC 6455).
net-websocket-Handshake.salam
واردسازی شبکه.وب‌سوکت شبکه
واردسازی رشته

روال ریشه:
    سرچاپ وب‌سوکت شبکه.کلید پذیرش("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=")
پایان
خروجیs3pPLMBiTxaQ9kYGzzhZRbK+xOo= GET /chat HTTP/1.1 true HTTP/1.1 101 Switching Protocols true

پاسخ دست دادن 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: رشته)
گواهی و کلید TLS را برای پذیرش اتصال امن بارگذاری می‌کند.
net-websocket-WSS.salam
واردسازی شبکه.وب‌سوکت شبکه

روال ریشه:
    ناپایا ک := وب‌سوکت شبکه.شماره گیری امن("echo.example.com"، ۴۴۳، "/")
    ناپایا ک۲ := وب‌سوکت شبکه.شماره گیری امن با سربرگ("echo.example.com"، ۴۴۳، "/"، "Origin: https://salamlang.ir\r\n")
    ناپایا ک۳ := وب‌سوکت شبکه.شماره گیری امن بدون بررسی("localhost"، ۸۴۴۳، "/"، "")
    سرچاپ وب‌سوکت شبکه.باز است(ک)، وب‌سوکت شبکه.باز است(ک۲)، وب‌سوکت شبکه.باز است(ک۳)
    وب‌سوکت شبکه.بارگذاری پیکربندی امن("cert.pem"، "key.pem")
    س := وب‌سوکت شبکه.شنود(۸۴۴۳)
    ناپایا ا := وب‌سوکت شبکه.پذیرش امن(س)
    _ := وب‌سوکت شبکه.ارسال متن(ا، "سلام")
    وب‌سوکت شبکه.بستن(ا)
پایان

پذیرش امن AcceptWSS

روال پذیرش امن(srv: سرور): اتصال وب
اتصال امن (wss) می‌پذیرد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: 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: رشته): اتصال وب
اتصال امن (wss).

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: 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