srudp
1.0.0
该存储库提供安全可靠的数据流,其工作方式类似于 TCP。
我的目的是使用户能够在封闭 NAT 中的客户端之间创建 P2P 连接。
针对“无法在我的情况下工作”的用户的教程
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
准备两台独立的PC。
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 秒发送一次消息“hello”。
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 协议需要大量连接,你就不必使用异步方法。
如今,PC 位于受 NAT 保护的本地环境中。在两个外部之间传输数据很困难。为了解决这个问题,通过UDP打洞的方式实现连接,而不使用UPnP。
UDP 是一种套接字协议,具有用于连接应用程序的最少功能。因此,没有连接状态,数据可能无法到达,很容易欺骗源。这就是为什么你不能将其替换为 TCP。
有了这个程序,你就可以像TCP一样对待它,而不必担心上述问题。也就是说,它具有连接状态,保证数据可达,并且难以伪造。
@namuyan
麻省理工学院