PurePython实现的安全可靠的udp套接字
srudp的Python项目详细描述
安全可靠的UDP
此存储库提供安全可靠的数据流,其工作原理与TCP类似。
我的目的是让用户在封闭的NAT中创建客户端之间的P2P连接。在
特点
- 纯Python
- 与普通套接字对象类似的用法
- 类似于RUDP的协议
- UDP打孔
- 高性能(10mb时4Mbps/s上升和下降)
- ipv4/ipv6
- 可选异步
要求
- Python3.6+
- requirements.txt
安装
tutorial for users "cannot work on my condition"
pip3 install --user srudp
测试
^{pr2}$演示
准备两个独立的PC
fromsrudpimportSecureReliableSocketfromtimeimportsleep,timesock=SecureReliableSocket()sock.connect(("<remote host 1>",12345))whilenotsock.is_closed:sock.sendall(b'hello '+str(time()).encode())sleep(3)print("closed",sock)
一方,每3秒发一次问候。在
fromsrudpimportSecureReliableSocketfromtimeimporttimesock=SecureReliableSocket()sock.connect(("<remote host 2>",12345))whilenotsock.is_closed:data=sock.recv(1024)ifnotdata:breakprint(time(),data)print("closed",sock)
另一方面,接收到消息并立即显示。在
异步使用
fromsrudpimportSecureReliableSocketimportasyncio# Get a reference to the current event looploop=asyncio.get_event_loop()# create a socketsock=SecureReliableSocket()# connect() on another thread because block event loopaddress=("example.com",3000)awaitloop.run_in_executor(None,sock.connect,(address,))# Register the open socket to wait for datareader,writer=awaitasyncio.open_connection(sock=sock)# readdata=awaitreader.read(1024)# writewriter.write(b"hello")writer.write(b"world")awaitwriter.drain()# closewriter.close()
你可以像一个普通的TCP套接字那样做。 但如果你不想这样的话,比如HTTP协议需要很多连接, 你不必使用异步方法。在
为了避免麻烦
- 不要认为总是成功建立连接。 Web RTC检测UDP打孔成功,或者失败时使用替代方法,需要实现它。在
- UDP(和一些TCP)在公共网络上经常被阻塞 如机场免费wifi和大学局域网等。 此外,一些路由器和网络适配器有时会阻塞。在
- 我设计了这个simple TCP like socket对象。 这没有信号功能,没有数据专用 我将把它作为P2P的底层库之一
注意:为什么要做这个?在
现在,PC机位于受NAT保护的本地环境中。 很难在两个外部之间传输数据。 为了解决这个问题,通过UDP打孔实现连接 不使用UPnP。在
UDP是一种套接字协议,用于连接应用程序的功能最少。 因此,没有连接状态,数据可能无法访问, 欺骗源代码很容易。这就是为什么,你不能用TCP来代替它。在
有了这个程序,您可以像TCP一样处理它,而不必担心上述问题。 换句话说,它有一个连接状态,保证了数据的可访问性,并且很难伪造。在
链接
- Winny -Port0 setting-
- lean about WebRTC
- (24days) NAT Traversal
- Peer-to-Peer Communication Across Network Address Translators
作者
许可证
麻省理工学院
- 项目
标签: