ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
ΠΠ°ΡΠ° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π΅Π³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΌΡ ΡΠ΅ΡΠΈΠ»ΠΈ ΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ Π΄Π»Ρ Π²Π΅Π±Π° ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΡΡ ΠΈΠ³ΡΡ ΠΈ Π²ΡΠ±ΡΠ°Π»ΠΈ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ
Π Π°Π±ΠΎΡΠ°ΡΡΠ°Ρ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ Teeworlds
ΠΡ ΡΠ΅ΡΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡ Ρ ΠΎΠ±ΡΠΈΠΌΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡΠΌΠΈ ΠΏΠΎ ΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ΅ΡΠ΅Π²ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ΄ Π²Π΅Π±. ΠΠ±ΡΡΠ½ΠΎ ΡΡΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌΠΈ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ:
- XMLHttpRequest/fetch, Π΅ΡΠ»ΠΈ ΡΠ΅ΡΠ΅Π²Π°Ρ ΡΠ°ΡΡΡ ΡΠΎΡΡΠΎΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ· HTTP-Π·Π°ΠΏΡΠΎΡΠΎΠ², ΠΈΠ»ΠΈ
- WebSockets.
ΠΠ±Π° ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠ΅Π±ΡΡΡ Ρ
ΠΎΡΡΠΈΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΡΠ΅ΡΠ²Π΅ΡΠ°, ΠΈ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ
Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΈ ΡΡΠ΅ΡΠΈΠΉ ΠΏΡΡΡ β ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ΅ΡΡ ΠΈΠ· Π±ΡΠ°ΡΠ·Π΅ΡΠ°:
ΠΠ΄Π½Π°ΠΊΠΎ Ρ ΡΡΠΈΠΌ ΡΠ²ΡΠ·Π°Π½Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΡΡΡΠ΄Π½ΠΎΡΡΡ: ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ Π΄Π²Π° ΠΏΠΈΡΠ° WebRTC ΡΠΌΠΎΠ³ΡΡ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡΡΡΡ Π΄Π°Π½Π½ΡΠΌΠΈ, ΠΈΠΌ Π½ΡΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ»ΠΎΠΆΠ½ΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ Β«ΡΡΠΊΠΎΠΏΠΎΠΆΠ°ΡΠΈΡΒ» (handshake) Π΄Π»Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, Π΄Π»Ρ ΡΠ΅Π³ΠΎ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠΎΡΠΎΠ½Π½ΠΈΡ
ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ (ΡΠΈΠ³Π½Π°Π»ΡΠ½ΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ²
Π ΠΈΠ΄Π΅Π°Π»Π΅ ΠΌΡ Π±Ρ Ρ ΠΎΡΠ΅Π»ΠΈ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ΅ΡΠ΅Π²ΠΎΠΉ API, Π²Π½ΡΡΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠΉ WebRTC, Π½ΠΎ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ Π±Π»ΠΈΠ·ΠΊΠΈΠΉ ΠΊ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ UDP Sockets, ΠΊΠΎΡΠΎΡΠΎΠΌΡ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅.
ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π½Π°ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° WebRTC Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΡΠ°ΡΠΊΡΡΡΠΈΡ ΡΠ»ΠΎΠΆΠ½ΡΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠ΅ΠΉ ΠΊΠΎΠ΄Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (ΠΊΠΎΡΠΎΡΡΠΉ Π² ΡΠ²ΠΎΡΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅ ΠΌΡ Ρ ΠΎΡΠ΅Π»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡΠ΅).
ΠΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ WebRTC
WebRTC β ΡΡΠΎ ΠΈΠΌΠ΅ΡΡΠΈΠΉΡΡ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ°Ρ Π½Π°Π±ΠΎΡ API, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡΠΈΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ peer-to-peer Π·Π²ΡΠΊΠ°, Π²ΠΈΠ΄Π΅ΠΎ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ .
Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΈΡΠ°ΠΌΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ (Π΄Π°ΠΆΠ΅ Π² ΡΠ»ΡΡΠ°Π΅ Π½Π°Π»ΠΈΡΠΈΡ NAT Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ»ΠΈ ΠΎΠ±Π΅ΠΈΡ ΡΡΠΎΡΠΎΠ½) ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ² STUN ΠΈ/ΠΈΠ»ΠΈ TURN ΡΠ΅ΡΠ΅Π· ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ICE. ΠΠΈΡΡ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ICE ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ ΠΊΠ°Π½Π°Π»ΠΎΠ² ΡΠ΅ΡΠ΅Π· offer ΠΈ answer ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° SDP.
ΠΠ³ΠΎ! ΠΠ°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ Π°Π±Π±ΡΠ΅Π²ΠΈΠ°ΡΡΡ Π·Π° ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·. ΠΠ°Π²Π°ΠΉΡΠ΅ Π²ΠΊΡΠ°ΡΡΠ΅ ΠΎΠ±ΡΡΡΠ½ΠΈΠΌ, ΡΡΠΎ Π·Π½Π°ΡΠ°Ρ ΡΡΠΈ ΠΏΠΎΠ½ΡΡΠΈΡ:
Session Traversal Utilities for NAT (STUN) β ΠΏΡΠΎΡΠΎΠΊΠΎΠ» Π΄Π»Ρ ΠΎΠ±Ρ ΠΎΠ΄Π° NAT ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΠ°ΡΡ (IP, ΠΏΠΎΡΡ) Π΄Π»Ρ ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½ΡΠΌΠΈ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Ρ Ρ ΠΎΡΡΠΎΠΌ. ΠΡΠ»ΠΈ Π΅ΠΌΡ ΡΠ΄Π°ΡΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠ²ΠΎΡ Π·Π°Π΄Π°ΡΡ, ΡΠΎ ΠΏΠΈΡΡ ΠΌΠΎΠ³ΡΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡΡΡΡ Π΄Π°Π½Π½ΡΠΌΠΈ Π΄ΡΡΠ³ Ρ Π΄ΡΡΠ³ΠΎΠΌ.Traversal Using Relays around NAT (TURN) ΡΠΎΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΎΠ±Ρ ΠΎΠ΄Π° NAT, Π½ΠΎ ΠΎΠ½ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΡΡΠΎ, ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»ΡΡ Π΄Π°Π½Π½ΡΠ΅ ΡΠ΅ΡΠ΅Π· ΠΏΡΠΎΠΊΡΠΈ, Π²ΠΈΠ΄ΠΈΠΌΡΠΉ ΠΎΠ±ΠΎΠΈΠΌ ΠΏΠΈΡΠ°ΠΌ. ΠΠ½ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΡ ΠΈ Π±ΠΎΠ»Π΅Π΅ Π·Π°ΡΡΠ°ΡΠ΅Π½ Π² Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ, ΡΠ΅ΠΌ STUN (ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π½Π° ΠΏΡΠΎΡΡΠΆΠ΅Π½ΠΈΠΈ Π²ΡΠ΅Π³ΠΎ ΡΠ΅Π°Π½ΡΠ° ΡΠ²ΡΠ·ΠΈ), Π½ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° ΡΡΠΎ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ.Interactive Connectivity Establishment (ICE) ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Π²ΡΠ±ΠΎΡΠ° Π½Π°ΠΈΠ»ΡΡΡΠ΅Π³ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ ΡΠΏΠΎΡΠΎΠ±Π° ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π΄Π²ΡΡ ΠΏΠΈΡΠΎΠ² Π½Π° ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠΉ ΠΏΡΠΈ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎΠΌ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΈ ΠΏΠΈΡΠΎΠ², Π° ΡΠ°ΠΊΠΆΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠΉ Π»ΡΠ±ΡΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ² STUN ΠΈ TURN.Session Description Protocol (SDP) β ΡΡΠΎ ΡΠΎΡΠΌΠ°Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΊΠ°Π½Π°Π»Π° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠΎΠ² ICE, ΠΊΠΎΠ΄Π΅ΠΊΠΎΠ² ΠΌΡΠ»ΡΡΠΈΠΌΠ΅Π΄ΠΈΠ° (Π² ΡΠ»ΡΡΠ°Π΅ Π·Π²ΡΠΊΠΎΠ²ΠΎΠ³ΠΎ/Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Π½Π°Π»Π°), ΠΈ Ρ.ΠΏβ¦ ΠΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΠΈΡΠΎΠ² ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ SDP Offer (Β«ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅Β»), Π° Π²ΡΠΎΡΠΎΠΉ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ SDP Answer (Β«ΠΎΡΠΊΠ»ΠΈΠΊΠΎΠΌΒ»). ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΠΊΠ°Π½Π°Π».
Π§ΡΠΎΠ±Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ°ΠΊΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅, ΠΏΠΈΡΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ±ΡΠ°ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΡ ΠΈΠΌΠΈ ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ² STUN ΠΈ TURN, ΠΈ ΠΎΠ±ΠΌΠ΅Π½ΡΡΡΡΡ Π΅Ρ Π΄ΡΡΠ³ Ρ Π΄ΡΡΠ³ΠΎΠΌ.
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ Ρ Π½ΠΈΡ ΠΏΠΎΠΊΠ° Π½Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡΡΡΡ Π΄Π°Π½Π½ΡΠΌΠΈ Π½Π°ΠΏΡΡΠΌΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π΄Π»Ρ ΠΎΠ±ΠΌΠ΅Π½Π° ΡΡΠΈΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ Π²Π½Π΅ΠΏΠΎΠ»ΠΎΡΠ½ΠΎΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ: ΡΠΈΠ³Π½Π°Π»ΡΠ½ΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ.
Π‘ΠΈΠ³Π½Π°Π»ΡΠ½ΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΡΠΌ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π΅Π³ΠΎ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½Π°Ρ Π·Π°Π΄Π°ΡΠ° β ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΈΡΠ°ΠΌΠΈ Π½Π° ΡΡΠ°ΠΏΠ΅ Β«ΡΡΠΊΠΎΠΏΠΎΠΆΠ°ΡΠΈΡΒ» (ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΡΡ Π΅ΠΌΠ΅ Π½ΠΈΠΆΠ΅).
Π£ΠΏΡΠΎΡΡΠ½Π½Π°Ρ ΡΡ
Π΅ΠΌΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Β«ΡΡΠΊΠΎΠΏΠΎΠΆΠ°ΡΠΈΡΒ» WebRTC
ΠΠ±Π·ΠΎΡ ΡΠ΅ΡΠ΅Π²ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ Teeworlds
Π‘Π΅ΡΠ΅Π²Π°Ρ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Teeworlds ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠ°:
- ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ° β ΡΡΠΎ Π΄Π²Π΅ ΡΠ°Π·Π½ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
- ΠΠ»ΠΈΠ΅Π½ΡΡ Π²ΡΡΡΠΏΠ°ΡΡ Π² ΠΈΠ³ΡΡ, ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡΡ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ², ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ Π·Π° ΡΠ°Π· Ρ ΠΎΡΡΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Ρ ΠΈΠ³ΡΡ.
- ΠΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° Π΄Π°Π½Π½ΡΡ Π² ΠΈΠ³ΡΠ΅ Π²Π΅Π΄ΡΡΡΡ ΡΠ΅ΡΠ΅Π· ΡΠ΅ΡΠ²Π΅Ρ.
- ΠΡΠΎΠ±ΡΠΉ ΠΌΠ°ΡΡΠ΅Ρ-ΡΠ΅ΡΠ²Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠ±ΠΎΡΠ° ΡΠΏΠΈΡΠΊΠ° Π²ΡΠ΅Ρ ΠΏΡΠ±Π»ΠΈΡΠ½ΡΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ Π² ΠΈΠ³ΡΠΎΠ²ΠΎΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠ΅.
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π΄Π»Ρ ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½ΡΠΌΠΈ WebRTC ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΈΠ³ΡΡ Π² Π±ΡΠ°ΡΠ·Π΅Ρ, Π³Π΄Π΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ. ΠΡΠΎ Π΄Π°ΡΡ Π½Π°ΠΌ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡβ¦
ΠΠ·Π±Π°Π²ΠΈΡΡΡΡ ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ²
ΠΡΡΡΡΡΡΠ²ΠΈΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΈΠΌΠ΅Π΅Ρ ΠΏΡΠΈΡΡΠ½ΠΎΠ΅ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ: ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡ Π²ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ ΡΡΠ°ΡΠΈΡΠ½ΡΠΉ ΠΊΠΎΠ½ΡΠ΅Π½Ρ Π½Π° Github Pages ΠΈΠ»ΠΈ Π½Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΌ ΠΎΠ±ΠΎΡΡΠ΄ΠΎΠ²Π°Π½ΠΈΠΈ Π·Π° Cloudflare, ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ² ΡΠ΅Π±Π΅ Π±ΡΡΡΡΡΠ΅ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΈ Π²ΡΡΠΎΠΊΠΈΠΉ Π°ΠΏΡΠ°ΠΉΠΌ. ΠΠΎ ΡΡΡΠΈ, ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΎ Π½ΠΈΡ Π·Π°Π±ΡΡΡ, ΠΈ Π΅ΡΠ»ΠΈ Π½Π°ΠΌ ΠΏΠΎΠ²Π΅Π·ΡΡ ΠΈ ΠΈΠ³ΡΠ° ΡΡΠ°Π½Π΅Ρ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΠΉ, ΡΠΎ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΡ ΠΌΠΎΠ΄Π΅ΡΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π½Π΅ ΠΏΡΠΈΠ΄ΡΡΡΡ.
ΠΠ΄Π½Π°ΠΊΠΎ ΡΡΠΎΠ±Ρ ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠ°Π±ΠΎΡΠ°Π»Π°, Π½Π°ΠΌ Π²ΡΡ ΡΠ°Π²Π½ΠΎ ΠΏΡΠΈΠ΄ΡΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²Π½Π΅ΡΠ½ΡΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ:
- ΠΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ² STUN: Ρ Π½Π°Ρ Π΅ΡΡΡ Π²ΡΠ±ΠΎΡ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΡΡ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ².
- ΠΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΡΠ΅ΡΠ²Π΅Ρ TURN: Π·Π΄Π΅ΡΡ Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΡΡ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² Π½Π΅Ρ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ»ΠΈ Π½Π°ΡΡΡΠΎΠΈΡΡ ΡΠ²ΠΎΠΉ, ΠΈΠ»ΠΈ ΠΏΠ»Π°ΡΠΈΡΡ Π·Π° ΡΠ΅ΡΠ²ΠΈΡ. Π ΡΡΠ°ΡΡΡΡ, Π±ΠΠ»ΡΡΡΡ ΡΠ°ΡΡΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΡΠ΅ΡΠ΅Π· ΡΠ΅ΡΠ²Π΅ΡΡ STUN (ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ ΠΈΡΡΠΈΠ½Π½ΡΠΉ p2p), Π½ΠΎ TURN Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ Π·Π°ΠΏΠ°ΡΠ½ΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ.
- Π‘ΠΈΠ³Π½Π°Π»ΡΠ½ΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ: Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Π΄Π²ΡΡ Π΄ΡΡΠ³ΠΈΡ Π°ΡΠΏΠ΅ΠΊΡΠΎΠ², ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ΠΎ. Π’ΠΎ, Π·Π° ΡΡΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π±ΡΠ΄Π΅Ρ ΠΎΡΠ²Π΅ΡΠ°ΡΡ ΡΠΈΠ³Π½Π°Π»ΡΠ½ΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ, Π² ΡΡΠΌ-ΡΠΎ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠ΅ΡΠ΅Π΄ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΎΠΉ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±ΠΌΠ΅Π½ΡΡΡΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠΌ ΠΎΠ±ΡΡΠΌΠΎΠΌ Π΄Π°Π½Π½ΡΡ .
- ΠΠ°ΡΡΠ΅Ρ-ΡΠ΅ΡΠ²Π΅Ρ Teeworlds: ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ°ΠΌΠΈ Π΄Π»Ρ ΠΎΠΏΠΎΠ²Π΅ΡΠ΅Π½ΠΈΡ ΠΎ ΡΠ²ΠΎΡΠΌ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌΠΈ Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΠΏΡΠ±Π»ΠΈΡΠ½ΡΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ². Π₯ΠΎΡΡ ΠΎΠ½ ΠΈ Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»Π΅Π½ (ΠΊΠ»ΠΈΠ΅Π½ΡΡ Π²ΡΠ΅Π³Π΄Π° ΠΌΠΎΠ³ΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡ ΠΊ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎΠΌΡ ΠΈΠΌ ΡΠ΅ΡΠ²Π΅ΡΡ Π²ΡΡΡΠ½ΡΡ), Π±ΡΠ»ΠΎ Π±Ρ Ρ ΠΎΡΠΎΡΠΎ Π΅Π³ΠΎ ΠΈΠΌΠ΅ΡΡ, ΡΡΠΎΠ±Ρ ΠΈΠ³ΡΠΎΠΊΠΈ ΠΌΠΎΠ³Π»ΠΈ ΡΡΠ°ΡΡΠ²ΠΎΠ²Π°ΡΡ Π² ΠΈΠ³ΡΠ°Ρ ΡΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΌΠΈ Π»ΡΠ΄ΡΠΌΠΈ.
ΠΡ ΡΠ΅ΡΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΡΠ΅ ΡΠ΅ΡΠ²Π΅ΡΡ STUN ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Google, Π° ΠΎΠ΄ΠΈΠ½ ΡΠ΅ΡΠ²Π΅Ρ TURN ΡΠ°Π·Π²Π΅ΡΠ½ΡΠ»ΠΈ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ.
ΠΠ»Ρ Π΄Π²ΡΡ
ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ
ΠΏΡΠ½ΠΊΡΠΎΠ² ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ
- ΠΠ°ΡΡΠ΅Ρ-ΡΠ΅ΡΠ²Π΅Ρ Teeworlds ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ: ΠΊΠ°ΠΊ ΡΠΏΠΈΡΠΎΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ (ΠΈΠΌΡ, IP, ΠΊΠ°ΡΡΠ°, ΡΠ΅ΠΆΠΈΠΌ, β¦) ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ°. Π‘Π΅ΡΠ²Π΅ΡΡ ΠΏΡΠ±Π»ΠΈΠΊΡΡΡ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, Π° ΠΊΠ»ΠΈΠ΅Π½ΡΡ Π±Π΅ΡΡΡ Π²Π΅ΡΡ ΡΠΏΠΈΡΠΎΠΊ ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ Π΅Π³ΠΎ ΠΈΠ³ΡΠΎΠΊΡ. Π’Π°ΠΊΠΆΠ΅ ΠΌΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌ ΡΠΏΠΈΡΠΎΠΊ Π½Π° Π΄ΠΎΠΌΠ°ΡΠ½Π΅ΠΉ ΡΡΡΠ°Π½ΠΈΡΠ΅ ΠΊΠ°ΠΊ HTML, ΡΡΠΎΠ±Ρ ΠΈΠ³ΡΠΎΠΊΠΈ ΠΌΠΎΠ³Π»ΠΈ ΠΏΡΠΎΡΡΠΎ Π½Π°ΠΆΠ°ΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ ΠΈ ΠΏΡΡΠΌΠΈΠΊΠΎΠΌ ΠΏΠΎΠΏΠ°ΡΡΡ Π² ΠΈΠ³ΡΡ.
- Π‘ΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΡΠ½ΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ Π½Π°ΡΠ΅ΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΡΠΎΠΊΠ΅ΡΠΎΠ², ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠΉ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅.
Π‘ΠΏΠΈΡΠΎΠΊ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ² Π²Π½ΡΡΡΠΈ ΠΈΠ³ΡΡ ΠΈ Π½Π° Π΄ΠΎΠΌΠ°ΡΠ½Π΅ΠΉ ΡΡΡΠ°Π½ΠΈΡΠ΅
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΎΠΊΠ΅ΡΠΎΠ²
ΠΡ Ρ ΠΎΡΠΈΠΌ ΡΠΎΠ·Π΄Π°ΡΡ API, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ Π±Π»ΠΈΠ·ΠΊΠΈΠΉ ΠΊ Posix UDP Sockets, ΡΡΠΎΠ±Ρ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.
Π’Π°ΠΊ ΠΆΠ΅ ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΉ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ, ΡΡΠ΅Π±ΡΡΡΠΈΠΉΡΡ Π΄Π»Ρ ΠΏΡΠΎΡΡΠ΅ΠΉΡΠ΅Π³ΠΎ ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½ΡΠΌΠΈ ΠΏΠΎ ΡΠ΅ΡΠΈ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½Π° Π½Π°ΡΡΠΎΡΡΠ°Ρ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΈΡ: Π²ΡΠ΅ ΠΏΠΈΡΡ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π² ΠΎΠ΄Π½ΠΎΠΉ Β«Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ LANΒ», ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠΉ Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠΌ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ Firebase.
Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π½Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½Ρ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠ΅ IP-Π°Π΄ΡΠ΅ΡΠ°: Π΄Π»Ρ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΏΠΈΡΠΎΠ² Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΊΠ»ΡΡΠ΅ΠΉ Firebase (Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Π΄ΠΎΠΌΠ΅Π½Π½ΡΠΌ ΠΈΠΌΠ΅Π½Π°ΠΌ), ΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΠΈΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ Π½Π°Π·Π½Π°ΡΠ°Π΅Ρ Β«ΡΠ°Π»ΡΡΠΈΠ²ΡΠ΅Β» IP-Π°Π΄ΡΠ΅ΡΠ° ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΠΊΠ»ΡΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ. ΠΡΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΈΠ·Π±Π°Π²Π»ΡΠ΅Ρ Π½Π°Ρ ΠΎΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΡ IP-Π°Π΄ΡΠ΅ΡΠΎΠ², ΡΡΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π΅ΡΡΠΈΠ²ΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ.
ΠΠΎΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ API, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ:
// Create and destroy a socket
int socket();
int close(int fd);
// Bind a socket to a port, and publish it on Firebase
int bind(int fd, AddrInfo* addr);
// Send a packet. This lazily create a WebRTC connection to the
// peer when necessary
int sendto(int fd, uint8_t* buf, int len, const AddrInfo* addr);
// Receive the packets destined to this socket
int recvfrom(int fd, uint8_t* buf, int len, AddrInfo* addr);
// Be notified when new packets arrived
int recvCallback(Callback cb);
// Obtain a local ip address for this peer key
uint32_t resolve(client::String* key);
// Get the peer key for this ip
String* reverseResolve(uint32_t addr);
// Get the local peer key
String* local_key();
// Initialize the library with the given Firebase database and
// WebRTc connection options
void init(client::FirebaseConfig* fb, client::RTCConfiguration* ice);
API ΠΏΡΠΎΡΡ ΠΈ ΠΏΠΎΡ ΠΎΠΆ Π½Π° API Posix Sockets, Π½ΠΎ ΠΈΠΌΠ΅Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Π°ΠΆΠ½ΡΡ ΠΎΡΠ»ΠΈΡΠΈΠΉ: ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΠΎΠ±ΡΠ°ΡΠ½ΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ², Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ IP ΠΈ Β«Π»Π΅Π½ΠΈΠ²ΠΎΠ΅Β» ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅.
Π Π΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΠΎΠ±ΡΠ°ΡΠ½ΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ²
ΠΠ°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΈΡΡ ΠΎΠ΄Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠΉ Π²Π²ΠΎΠ΄-Π²ΡΠ²ΠΎΠ΄, Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° Π² Π²Π΅Π±-Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ ΠΊΠΎΠ΄ Π½ΡΠΆΠ½ΠΎ ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ.
ΠΡΠΈΡΠΈΠ½Π° ΡΡΠΎΠ³ΠΎ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΠΈΠΊΠ» ΡΠΎΠ±ΡΡΠΈΠΉ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ ΡΠΊΡΡΡ ΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ (Π±ΡΠ΄Ρ ΡΠΎ JavaScript ΠΈΠ»ΠΈ WebAssembly).
Π Π½Π°ΡΠΈΠ²Π½ΠΎΠΉ ΡΡΠ΅Π΄Π΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΈΡΠ°ΡΡ ΠΊΠΎΠ΄ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ
while(running) {
select(...); // wait for I/O events
while(true) {
int r = readfrom(...); // try to read
if (r < 0 && errno == EWOULDBLOCK) // no more data available
break;
...
}
...
}
ΠΡΠ»ΠΈ ΡΠΈΠΊΠ» ΡΠΎΠ±ΡΡΠΈΠΉ Π΄Π»Ρ Π½Π°Ρ ΡΠΊΡΡΡ, ΡΠΎ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΡΡ Π΅Π³ΠΎ Π² Π½Π΅ΡΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅:
auto cb = []() { // this will be called when new data is available
while(true) {
int r = readfrom(...); // try to read
if (r < 0 && errno == EWOULDBLOCK) // no more data available
break;
...
}
...
};
recvCallback(cb); // register the callback
ΠΠ°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ IP
ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ ΡΠ·Π»ΠΎΠ² Π² Π½Π°ΡΠ΅ΠΉ Β«ΡΠ΅ΡΠΈΒ» ΡΠ²Π»ΡΡΡΡΡ Π½Π΅ IP-Π°Π΄ΡΠ΅ΡΠ°ΠΌΠΈ, Π° ΠΊΠ»ΡΡΠ°ΠΌΠΈ Firebase (ΡΡΠΎ ΡΡΡΠΎΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠ³Π»ΡΠ΄ΡΡ ΡΠ°ΠΊ: -LmEC50PYZLCiCP-vqde
).
ΠΡΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ΅Π½ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Π΄Π»Ρ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΡ IP ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΈΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΡΡΠΈ (Π° ΡΠ°ΠΊΠΆΠ΅ ΠΈΡ ΡΡΠΈΠ»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎΡΠ»Π΅ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°), Π½ΠΎ ΡΠ°ΡΡΠΎ Π±ΡΠ²Π°Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΈΡΠΎΠ² ΠΏΠΎ ΡΠΈΡΠ»ΠΎΠ²ΠΎΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ.
ΠΠΌΠ΅Π½Π½ΠΎ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ resolve
ΠΈ reverseResolve
: ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊΠΈΠΌ-ΡΠΎ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΡΡΡΠΎΠΊΠΎΠ²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΡΡΠ° (ΡΠ΅ΡΠ΅Π· Π²Π²ΠΎΠ΄ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈΠ»ΠΈ ΡΠ΅ΡΠ΅Π· ΠΌΠ°ΡΡΠ΅Ρ-ΡΠ΅ΡΠ²Π΅Ρ), ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π² IP-Π°Π΄ΡΠ΅Ρ Π΄Π»Ρ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ. ΠΡΡΠ°Π»ΡΠ½Π°Ρ ΡΠ°ΡΡΡ API ΡΠΎΠΆΠ΅ Π΄Π»Ρ ΠΏΡΠΎΡΡΠΎΡΡ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π²ΠΌΠ΅ΡΡΠΎ ΡΡΡΠΎΠΊΠΈ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
ΠΡΠΎ ΠΏΠΎΡ ΠΎΠΆΠ΅ Π½Π° DNS-ΠΏΠΎΠΈΡΠΊ, ΡΠΎΠ»ΡΠΊΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°.
Π’ΠΎ Π΅ΡΡΡ IP-Π°Π΄ΡΠ΅ΡΠ° Π½Π΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΎΠ±ΡΠΈΠΌΠΈ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ², ΠΈ Π΅ΡΠ»ΠΈ Π½ΡΠΆΠ΅Π½ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ, ΡΠΎ Π΅Π³ΠΎ ΠΏΡΠΈΠ΄ΡΡΡΡ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ.
ΠΠ΅Π½ΠΈΠ²ΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅
UDP Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, Π½ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ Π²ΠΈΠ΄Π΅Π»ΠΈ, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ Π½Π°ΡΠ°ΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π΄Π°Π½Π½ΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²ΡΠΌΡ ΠΏΠΈΡΠ°ΠΌΠΈ, WebRTC ΡΡΠ΅Π±ΡΠ΅Ρ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ.
ΠΡΠ»ΠΈ ΠΌΡ Ρ
ΠΎΡΠΈΠΌ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ ΡΠΎΡ ΠΆΠ΅ ΡΡΠΎΠ²Π΅Π½Ρ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΈ, (sendto
/recvfrom
Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌΠΈ ΠΏΠΈΡΠ°ΠΌΠΈ Π±Π΅Π· ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ), ΡΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Β«Π»Π΅Π½ΠΈΠ²ΠΎΠ΅Β» (ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅) ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π²Π½ΡΡΡΠΈ API.
ΠΠΎΡ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΡΠΈ ΠΎΠ±ΡΡΠ½ΠΎΠΌ ΠΎΠ±ΠΌΠ΅Π½Π΅ Π΄Π°Π½Π½ΡΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Β«ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌΒ» ΠΈ Β«ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌΒ» Π² ΡΠ»ΡΡΠ°Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ UDP, ΠΈ ΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π½Π°ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°:
- Π‘Π΅ΡΠ²Π΅Ρ Π²ΡΠ·ΡΠ²Π°Π΅Ρ
bind()
, ΡΡΠΎΠ±Ρ ΡΠΎΠΎΠ±ΡΠΈΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅, ΡΡΠΎ Ρ ΠΎΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΏΠ°ΠΊΠ΅ΡΡ Π² ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ ΠΏΠΎΡΡ.
ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΌΡ ΠΎΠΏΡΠ±Π»ΠΈΠΊΡΠ΅ΠΌ ΠΎΡΠΊΡΡΡΡΠΉ ΠΏΠΎΡΡ Π² Firebase ΠΏΠΎΠ΄ ΠΊΠ»ΡΡΠΎΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΈ Π±ΡΠ΄Π΅ΠΌ ΡΠ»ΡΡΠ°ΡΡ ΡΠΎΠ±ΡΡΠΈΡ Π² Π΅Π³ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠ΅Π²Π΅.
- Π‘Π΅ΡΠ²Π΅Ρ Π²ΡΠ·ΡΠ²Π°Π΅Ρ
recvfrom()
, ΠΏΡΠΈΠ½ΠΈΠΌΠ°Ρ Π² ΡΡΠΎΡ ΠΏΠΎΡΡ ΠΏΠ°ΠΊΠ΅ΡΡ, ΠΏΠΎΡΡΡΠΏΠ°ΡΡΠΈΠ΅ ΠΎΡ Π»ΡΠ±ΠΎΠ³ΠΎ Ρ ΠΎΡΡΠ°.
Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ Π²Ρ ΠΎΠ΄ΡΡΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ², ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΡ Π² ΡΡΠΎΡ ΠΏΠΎΡΡ.
ΠΠ°ΠΆΠ΄ΡΠΉ ΠΏΠΎΡΡ ΠΈΠΌΠ΅Π΅Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΠΈ ΠΌΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π² Π½Π°ΡΠ°Π»ΠΎ Π΄Π°ΡΠ°Π³ΡΠ°ΠΌΠΌ WebRTC ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΈ ΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ ΠΏΠΎΡΡΡ, ΡΡΠΎΠ±Ρ Π·Π½Π°ΡΡ, Π² ΠΊΠ°ΠΊΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²ΠΈΡΡ ΠΏΡΠΈ ΠΏΠΎΡΡΡΠΏΠ»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ.
ΠΡΠ·ΠΎΠ² ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠΌ, ΠΏΠΎΡΡΠΎΠΌΡ Π΅ΡΠ»ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² Π½Π΅Ρ, ΠΌΡ ΠΏΡΠΎΡΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ -1 ΠΈ Π·Π°Π΄Π°ΡΠΌ errno=EWOULDBLOCK
.
- ΠΠ»ΠΈΠ΅Π½Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π½Π΅ΠΊΠΈΠΌΠΈ Π²Π½Π΅ΡΠ½ΠΈΠΌΠΈ ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌΠΈ IP ΠΈ ΠΏΠΎΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ°, ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅Ρ
sendto()
. Π’Π°ΠΊΠΆΠ΅ ΠΏΡΠΈ ΡΡΠΎΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ Π²ΡΠ·ΠΎΠ²bind()
, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠΉrecvfrom()
ΠΏΠΎΠ»ΡΡΠΈΡ ΠΎΡΠ²Π΅Ρ Π±Π΅Π· ΡΠ²Π½ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ bind.
Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ Π²Π½Π΅ΡΠ½ΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΡΡΡΠΎΠΊΠΎΠ²ΡΠΉ ΠΊΠ»ΡΡ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡ resolve()
Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ IP-Π°Π΄ΡΠ΅ΡΠ°.
ΠΠ° ΡΡΠΎΠΌ ΡΡΠ°ΠΏΠ΅ ΠΌΡ Π½Π°ΡΠΈΠ½Π°Π΅ΠΌ Β«ΡΡΠΊΠΎΠΏΠΎΠΆΠ°ΡΠΈΠ΅Β» WebRTC, Π΅ΡΠ»ΠΈ Π΄Π²Π° ΠΏΠΈΡΠ° Π΅ΡΡ Π½Π΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Ρ Π΄ΡΡΠ³ Ρ Π΄ΡΡΠ³ΠΎΠΌ. ΠΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊ ΡΠ°Π·Π½ΡΠΌ ΠΏΠΎΡΡΠ°ΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΈΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΉ DataChannel WebRTC.
Π’Π°ΠΊΠΆΠ΅ ΠΌΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ ΠΊΠΎΡΠ²Π΅Π½Π½ΡΠΉ bind()
, ΡΡΠΎΠ±Ρ ΡΠ΅ΡΠ²Π΅Ρ ΠΌΠΎΠ³ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ sendto()
Π½Π° ΡΠ»ΡΡΠ°ΠΉ, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΎ ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-ΡΠΎ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ Π·Π°ΠΊΡΡΠ»ΠΎΡΡ.
Π‘Π΅ΡΠ²Π΅Ρ ΡΠ²Π΅Π΄ΠΎΠΌΠ»ΡΠ΅ΡΡΡ ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ ΡΠ²ΠΎΠΉ SDP offer ΠΏΠΎΠ΄ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ΠΏΠΎΡΡΠ° ΡΠ΅ΡΠ²Π΅ΡΠ° Π² Firebase, ΠΈ ΡΠ΅ΡΠ²Π΅Ρ ΡΠ°ΠΌ ΠΆΠ΅ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ ΡΠ²ΠΎΠΈΠΌ ΠΎΡΠΊΠ»ΠΈΠΊΠΎΠΌ.
ΠΠ° ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π½ΠΈΠΆΠ΅ ΡΡ Π΅ΠΌΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π΄Π»Ρ ΡΡ Π΅ΠΌΡ ΡΠΎΠΊΠ΅ΡΠΎΠ² ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΡΠ΅ΡΠ²Π΅ΡΡ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ:
ΠΠΎΠ»Π½Π°Ρ ΡΡ
Π΅ΠΌΠ° ΡΡΠ°ΠΏΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΡΠ»ΠΈ Π²Ρ Π΄ΠΎΡΠΈΡΠ°Π»ΠΈ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ°, ΡΠΎ Π²Π°ΠΌ Π½Π°Π²Π΅ΡΠ½ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° ΡΠ΅ΠΎΡΠΈΡ Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΠΈ. Π ΠΈΠ³ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠ³ΡΠ°ΡΡ Π½Π°
ΠΡΡΠΆΠ΅ΡΠΊΠΈΠΉ ΠΌΠ°ΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠ»Π»Π΅Π³Π°ΠΌΠΈ
ΠΠΎΠ΄ ΡΠ΅ΡΠ΅Π²ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π°
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com