Ce référentiel fournit un flux de données sécurisé et fiable qui fonctionne comme TCP.
Mon objectif est de permettre aux utilisateurs de créer une connexion P2P entre les clients dans un NAT fermé.
tutoriel pour les utilisateurs "je ne peux pas travailler dans mon état"
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
Préparez deux PC indépendants.
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 )
A côté, envoyez un message bonjour une fois toutes les 3 secondes.
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 )
Un autre côté, recevez le message et montrez-le immédiatement.
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 ()
Vous pouvez faire comme un socket TCP normal. Mais si vous n'en avez pas l'intention, comme le protocole HTTP qui nécessite beaucoup de connexions, vous n'êtes pas obligé d'utiliser la méthode asynchrone.
De nos jours, le PC est situé dans un environnement local protégé par NAT. Il est difficile de transférer des données entre deux extérieurs. Afin de résoudre ce problème, la connexion est réalisée par perforation UDP sans utiliser UPnP.
UDP est un protocole socket avec un minimum de fonctions pour connecter des applications. Par conséquent, il n’y a pas d’état de connexion, les données peuvent ne pas être accessibles, l’usurpation de la source est facile. C'est pourquoi vous ne pouvez pas le remplacer par TCP.
Avec ce programme, vous pouvez le traiter comme TCP sans vous soucier des problèmes ci-dessus. En d’autres termes, il dispose d’un état de connexion, garantit l’accessibilité des données et est difficile à falsifier.
@namuyan
MIT