srudp
1.0.0
該儲存庫提供安全可靠的資料流,其工作方式類似於 TCP。
我的目的是使用戶能夠在封閉 NAT 中的客戶端之間建立 P2P 連線。
針對「無法在我的情況下工作」的用戶的教程
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
準備兩台獨立的PC。
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 秒發送一次訊息「hello」。
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
麻省理工學院