Dieses Repository bietet einen sicheren, zuverlässigen Datenstrom , der wie TCP funktioniert.
Mein Ziel ist es, Benutzern die Erstellung einer P2P-Verbindung zwischen Clients in geschlossenem NAT zu ermöglichen.
Tutorial für Benutzer „Kann an meinem Zustand nicht arbeiten“
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
Bereiten Sie zwei unabhängige PCs vor.
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 )
Eine Seite, sende einmal alle 3 Sekunden eine Hallo-Nachricht.
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 )
Eine andere Seite, erhalten Sie die Nachricht und zeigen Sie sie sofort.
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 ()
Sie können wie bei einem normalen TCP-Socket vorgehen. Wenn Sie jedoch nicht beabsichtigen, wie das HTTP-Protokoll, das viele Verbindungen erfordert, müssen Sie die asynchrone Methode nicht verwenden.
Heutzutage befindet sich der PC in einer lokalen Umgebung, die durch NAT geschützt ist. Es ist schwierig, Daten zwischen zwei Außenstellen zu übertragen. Um dieses Problem zu lösen, wird die Verbindung durch UDP-Locher ohne Verwendung von UPnP realisiert.
UDP ist ein Socket-Protokoll mit minimalen Funktionen zur Verbindung von Anwendungen. Daher gibt es keinen Verbindungsstatus, die Daten sind möglicherweise nicht erreichbar und es ist einfach, die Quelle zu fälschen. Aus diesem Grund können Sie es nicht durch TCP ersetzen.
Mit diesem Programm können Sie es wie TCP behandeln, ohne sich über die oben genannten Probleme Gedanken machen zu müssen. Mit anderen Worten: Es verfügt über einen Verbindungsstatus, garantiert die Erreichbarkeit der Daten und ist schwer zu fälschen.
@namuyan
MIT