พื้นที่เก็บข้อมูลนี้มอบ สตรีมข้อมูลที่เชื่อถือได้และปลอดภัย ซึ่งทำงานเหมือนกับ TCP
วัตถุประสงค์ของฉันคือช่วยให้ผู้ใช้สร้างการเชื่อมต่อ P2P ระหว่างไคลเอนต์ใน NAT แบบปิด
บทช่วยสอนสำหรับผู้ใช้ "ไม่สามารถทำงานได้ตามเงื่อนไขของฉัน"
pip3 install --user srudp
git clone https://github.com/namuyan/srudp
cd srudp
pip3 install --user -r requirements.txt
python3 -m mypy --config-file=mypy.ini srudp
python3 -m unittest discover
เตรียมพีซีแยกกันสองเครื่อง
from srudp import SecureReliableSocket
from time import sleep , time
sock = SecureReliableSocket ()
sock . connect (( "<remote host 1>" , 12345 ))
while not sock . is_closed :
sock . sendall ( b'hello ' + str ( time ()). encode ())
sleep ( 3 )
print ( "closed" , sock )
ข้างหนึ่งส่งข้อความสวัสดีครั้งหนึ่งใน 3 วินาที
from srudp import SecureReliableSocket
from time import time
sock = SecureReliableSocket ()
sock . connect (( "<remote host 2>" , 12345 ))
while not sock . is_closed :
data = sock . recv ( 1024 )
if not data :
break
print ( time (), data )
print ( "closed" , sock )
อีกด้านรับข้อความแล้วแสดงทันที
from srudp import SecureReliableSocket
import asyncio
# Get a reference to the current event loop
loop = asyncio . get_event_loop ()
# create a socket
sock = SecureReliableSocket ()
# connect() on another thread because block event loop
address = ( "example.com" , 3000 )
await loop . run_in_executor ( None , sock . connect , ( address ,))
# Register the open socket to wait for data
reader , writer = await asyncio . open_connection ( sock = sock )
# read
data = await reader . read ( 1024 )
# write
writer . write ( b"hello" )
writer . write ( b"world" )
await writer . drain ()
# close
writer . close ()
คุณสามารถทำได้เหมือนกับซ็อกเก็ต TCP ปกติ แต่ถ้าคุณไม่ได้ตั้งใจ เช่น โปรโตคอล HTTP ที่ต้องใช้การเชื่อมต่อจำนวนมาก คุณก็ไม่จำเป็นต้องใช้วิธีอะซิงก์
ปัจจุบันนี้ PC ตั้งอยู่ในสภาพแวดล้อมท้องถิ่นที่ได้รับการคุ้มครองโดย NAT การถ่ายโอนข้อมูลระหว่างบุคคลภายนอกสองคนทำได้ยาก เพื่อแก้ไขปัญหานี้ การเชื่อมต่อทำได้โดย การเจาะรู UDP โดยไม่ใช้ UPnP
UDP เป็นโปรโตคอลซ็อกเก็ตที่มีฟังก์ชันขั้นต่ำสำหรับการเชื่อมต่อแอปพลิเคชัน ดังนั้นจึงไม่มีสถานะการเชื่อมต่อ ข้อมูลอาจไม่สามารถเข้าถึงได้ การปลอมแปลงแหล่งที่มาเป็นเรื่องง่าย ด้วยเหตุนี้ คุณไม่สามารถแทนที่เป็น TCP ได้
ด้วยโปรแกรมนี้ คุณสามารถปฏิบัติต่อมันเหมือนกับ TCP โดยไม่ต้องกังวลเกี่ยวกับปัญหาข้างต้น กล่าวอีกนัยหนึ่ง มีสถานะการเชื่อมต่อ รับประกันการเข้าถึงข้อมูล และยากต่อการปลอมแปลง
@namuyan
เอ็มไอที