Este repositorio proporciona un flujo de datos seguro y confiable que funciona como TCP.
Mi propósito es permitir a los usuarios crear conexiones P2P entre clientes en NAT cerrada.
tutorial para usuarios "no puedo trabajar en mi condición"
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
Prepare dos PC independientes.
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 un lado, envía un mensaje de saludo una vez cada 3 segundos.
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 )
Otro lado, recibe el mensaje y muéstralo inmediatamente.
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 ()
Puedes hacerlo como un socket TCP normal. Pero si no es así, como el protocolo HTTP que requiere muchas conexiones, no es necesario utilizar el método asíncrono.
Hoy en día, la PC está ubicada en un entorno local protegido por NAT. Es difícil transferir datos entre dos externos. Para resolver este problema, la conexión se realiza mediante perforación UDP sin utilizar UPnP.
UDP es un protocolo de socket con funciones mínimas para conectar aplicaciones. Por lo tanto, no hay estado de conexión, es posible que no se pueda acceder a los datos y es fácil falsificar la fuente. Por eso no puedes sustituirlo por TCP.
Con este programa, puedes tratarlo como TCP sin preocuparte por los problemas anteriores. En otras palabras, tiene un estado de conexión, garantiza la accesibilidad de los datos y es difícil de falsificar.
@namuyan
MIT