Este repositório fornece fluxo de dados seguro e confiável que funciona como TCP.
Meu objetivo é permitir que os usuários criem conexões P2P entre clientes em NAT fechado.
tutorial para usuários "não consigo trabalhar na minha condição"
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 dois PCs independentes.
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 )
Ao lado, envie uma mensagem de alô uma vez a 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 )
Do outro lado, receba a mensagem e mostre imediatamente.
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 ()
Você pode fazer como um soquete TCP normal. Mas se você não pretende, como o protocolo HTTP que requer muitas conexões, não precisa usar o método assíncrono.
Atualmente, o PC está localizado em um ambiente local protegido por NAT. É difícil transferir dados entre duas partes externas. Para resolver este problema, a conexão é realizada por perfuração UDP sem usar UPnP.
UDP é um protocolo de soquete com funções mínimas para conectar aplicativos. Portanto, não há estado de conexão, os dados podem não estar acessíveis e falsificar a fonte é fácil. É por isso que você não pode substituí-lo por TCP.
Com este programa, você pode tratá-lo como o TCP, sem se preocupar com os problemas acima. Em outras palavras, possui um estado de conexão, garante a acessibilidade dos dados e é difícil de falsificar.
@namuyan
MIT