P2P原理

关键字 stun协议\P2P\UDP打洞\NAT 常用方法 中继 使用中继服务器连接两台内网设备,受限于中继节点性能。 逆向连接 当客户端A、B之一有公网地址时可以使用该方法。 UDP打洞 最常见的方法 利用锥形NAT(下文将介绍NAT分类)会将 内网ip+端口 绑定一个 外网ip+端口 的特性实现。理论上来说,利用该特性就可以实现任意主机间的通信,但往往 …

什么是容器

之前一直把容器理解成虚拟机,容器内的用户是独立的,与宿主机无关的,容器内的进程也是完全和宿主机隔离的。今天才知道这基本上是错误的,这是被vmware这类虚拟机形成思维定势了。 使用vmware创建一个虚拟机就好像在现实世界中,使用计算机完全模拟出来一个虚拟世界,这个虚拟世界的环境和真实世界一模一样,只不过它是用计算机模拟的。这个虚拟世界中出现任何问题都不会对 …

获取linux实时网速

linux中的/proc是一个虚拟目录,里面都是系统在运行过程中的各种状态,例如内存使用情况,网络情况,各个进程的运行情况等等。它是一个虚拟目录,只有在系统运行起来后才有而且仅存在于内存中。有点类似于MySQL的视图。 查看当前内存的使用情况: 查看网络的使用情况: 由此可知,如果想要计算当前的网络流速,则只需要在间隔1秒前后分别得到bytes列的数据,然后 …

python classmethod staticmethod

有两点不同 1. class method 会自动将当前class作为参数传入,但我觉得这并不能让它和 static method 产生差异,因为你完全可以这样写: class F(): @staticmethod def sm(cls): print(cls) @classmethod def cm(cls): print(cls) F.sm(S) # …

api VS spi

api 和 spi 的区别:api 就是别人写好一些函数,然后规定一个调用这些函数的声明集合,spi 简单理解就是回调函数的集合,例如在android或web等需要响应交互情况下,会有很多回调函数,例如 on_key_down() 用于监听键盘按下事件,on_mouse_move() 用于监听鼠标移动事件,这些函数都有一个特点,就是只会在特定的情况下自动触发 …

python multiprocessing Pipe Queue

两者功能类似,甚至可以说是相同,都是用于多进程通信。两者可以认为是Hibernate和JPA的关系,即Queue可以看作是对Pipe的进一步封装 Pipe的基本形式为: pipe1, pipe2 = multiprocessing.Pipe() def task1(p1, p2): p1.send("bingo") # 进程1向pipe1发送一条数据 def …

matplotlib.pyplot 一些基本概念

默认的figure和axes 首先明确概念,figure可以看作整个窗口,而axes只是其中的一个chart组件,figure中除了axes外,还有标题、按钮等组件 如果直接使用 plt.plot([1,2,3]),则会自动创建一个 figure,并且自动向该figure中添加一个 axes,画图就是在该axes中画 plt.plot([1,2,3]) # …

python多继承的问题

__new__ 考虑以下代码的输出结果: class A: print("AAAAA") def __init__(self): print("a init") ... def __new__(cls, *args, **kwargs): print("a new") return super(A, cls).__new__(cls) a = A() 结果为 …

linux定时任务

linux下可以使用 crontab 创建定时任务 怎么用 如果是最小化安装的ubuntu可能没有该服务,可以使用 sudo apt install cron 进行安装,安装后就可以使用cron或crontab crontab的使用方式很简单,输入 crontab -e 命令,就会弹出一个vim框,然后你就可以在里面输入 crontab 格式的指令,保存退出 …

linux的用户和组

UID和GID linux中每个用户都有一个UID和GID,且linux只认UID,用户名只是方便用户记忆而已,用户名和UID的关系有点像域名和ip的关系。 每个用户创建后默认会创建一个与用户名同名的组,并分配一个GID。 用户的UID和GID可以在 /etc/passwd 文件中查看到: 需要注意的是,密码拦全部为 X,这是历史遗留,早期密码确实存在这里, …