PurePython实现的安全可靠的udp套接字

srudp的Python项目详细描述


安全可靠的UDP

此存储库提供安全可靠的数据流,其工作原理与TCP类似。
我的目的是让用户在封闭的NAT中创建客户端之间的P2P连接。在

Build StatusDownloads

特点

  • 纯Python
  • 与普通套接字对象类似的用法
  • 类似于RUDP的协议
  • UDP打孔
  • 高性能(10mb时4Mbps/s上升和下降)
  • ipv4/ipv6
  • 可选异步

要求

安装

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一样处理它,而不必担心上述问题。 换句话说,它有一个连接状态,保证了数据的可访问性,并且很难伪造。在

链接

作者

@namuyan

许可证

麻省理工学院

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
在Glassfish服务器应用程序中重新启动后,java类不能转换为同一个类   Android API 23 java。网UnknownHostException:无法解析主机“URL”:没有与主机名关联的地址   Netty客户端中配置的java密码列表未发送到服务器   java如何从非活动类中检索上下文?   json如何在java中用整型键反序列化映射   java从外部类到其他内部类的子类划分   java无法从文件中读取字符串   swing如何使用Locale属性在java的Jtextfield中编写Unicode字符串。   java在应用程序启动时创建SQLlite数据库   Java中的重置按钮   javascript无法从服务器访问自定义CSS和JS文件   jquery需要对基于AJAX的具有REST功能的javaweb应用程序提出建议   继承Java中如何使用子对象调用父类的方法   排除子目录的java筛选器映射URL模式