Этот репозиторий обеспечивает безопасный надежный поток данных , который работает как TCP.
Моя цель — позволить пользователям создавать P2P-соединения между клиентами в закрытом NAT.
руководство для пользователей «не могу работать в моем состоянии»
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
Подготовьте два независимых компьютера.
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 секунды.
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, который требует большого количества соединений, вам не нужно использовать асинхронный метод.
В наши дни ПК находится в локальной среде, защищенной NAT. Трудно передавать данные между двумя внешними устройствами. Чтобы решить эту проблему, соединение реализуется путем пробивки отверстий UDP без использования UPnP.
UDP — протокол сокетов с минимальным набором функций для подключения приложений. Таким образом, состояние соединения отсутствует, данные могут быть недоступны, подделать источник легко. Вот почему вы не можете заменить его TCP.
С помощью этой программы вы можете обращаться с ним так же, как с TCP, не беспокоясь о вышеупомянутых проблемах. Другими словами, он имеет состояние соединения, гарантирует доступность данных и его трудно подделать.
@namuyan
Массачусетский технологический институт