用python模拟慢速网络的简单方法

用python模拟慢速网络的简单方法,python,networking,network-programming,Python,Networking,Network Programming,情景。我有一个客户端,有两个到服务器的网络连接。一个连接使用移动电话,另一个连接使用wlan连接 我解决这个问题的方法是让服务器在两个端口上侦听。但是,移动连接应该比wlan连接慢。发送的数据通常只是一行文本。我已经解决了连接速度较慢的问题,允许移动连接以五秒钟的间隔发送数据,wlan连接的间隔为一秒钟 但有没有更好的方法来应对经济放缓?也许通过发送更小的数据包,意味着我需要发送更多的数据 有没有什么好办法可以减缓其中一个连接的速度 奥扬普 一个只有一个连接的简单客户端示例 def client

情景。我有一个客户端,有两个到服务器的网络连接。一个连接使用移动电话,另一个连接使用wlan连接

我解决这个问题的方法是让服务器在两个端口上侦听。但是,移动连接应该比wlan连接慢。发送的数据通常只是一行文本。我已经解决了连接速度较慢的问题,允许移动连接以五秒钟的间隔发送数据,wlan连接的间隔为一秒钟

但有没有更好的方法来应对经济放缓?也许通过发送更小的数据包,意味着我需要发送更多的数据

有没有什么好办法可以减缓其中一个连接的速度

奥扬普

一个只有一个连接的简单客户端示例

def client():
    import sys, time, socket

    port = 11111
    host = '127.0.0.1'
    buf_size = 1024

    try:
        mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        mySocket.connect((host, port))
    except socket.error, (value, message):
        if mySocket:
            mySocket.close()
        print 'Could not open socket: ' + message
        sys.exit(1)
    mySocket.send('Hello, server')
    data = mySocket.recv(buf_size)
    print data
    time.sleep(5)

    mySocket.close()

client()
侦听一个端口的简单服务器

def server():
    import sys, os, socket

    port = 11111
    host = ''
    backlog = 5
    buf_size = 1024

    try:
        listening_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        listening_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) 
        listening_socket.bind((host, port)) 
        listening_socket.listen(backlog)
    except socket.error, (value, message):
        if listening_socket:
            listening_socket.close()
        print 'Could not open socket: ' + message
        sys.exit(1)

    while True:
        accepted_socket, adress = listening_socket.accept()
        data = accepted_socket.recv(buf_size)
        if data:
            accepted_socket.send('Hello, and goodbye.')
        accepted_socket.close()

server()

那么,使网络连接比另一个“慢”的原因是延迟和/或带宽。因此,如果你想进行真实的模拟,你需要找到你手机连接的带宽,以及它的延迟,并在你的客户端程序中进行模拟

但您似乎暗示您发送的数据很少,所以带宽可能不会真正影响您的连接速度。因此,您可以只模拟延迟,这就是您所做的:在发送的每个数据包之间睡眠(延迟)。不过,5秒似乎太多了

但如果你认为带宽可能是相关的,那么模拟起来其实很简单:带宽是每秒可以发送的最大字节数,延迟是到达目的地所需的时间

如何操作:有一个全局时间戳“blockedUntil”,表示您的连接再次空闲发送数据之前的时间。在程序开始时初始化为0,因为我们假定它尚未被使用。然后,每次有数据包要发送时,如果“\u blockedUntil”小于now(),请将其设置为now()。然后通过执行:packet.size()

现在计算dt=blockedUntil-Now(),将数据包添加到队列中,并在“dt”中添加一个计时器,它将弹出队列中的第一个数据包并发送它

好了,你已经模拟了带宽和延迟


编辑:正如有人提到的,还有丢包的问题。您可以通过具有丢弃数据包的概率来模拟这种情况注意:这仅在操作来自未连接协议(如以太网或UDP)的数据包时才可能发生。例如,在TCP的情况下,它将不起作用。

除了使用外部工具来模拟您感兴趣的网络类型之外,一个好的方法是使用套接字的替代实现

这涉及到将套接字构造作为函数的参数,而不是导入套接字模块并直接使用它。对于正常操作,您将传入真实的套接字类型,但是当您想要测试各种不利的网络条件时,可以传入模拟这些条件的实现。例如,您可以创建一个套接字类型,该类型参数化延迟和带宽(未测试的代码,请注意):

如果实现了其他套接字方法connect、recv等,则可以将此类的实例替换为实际套接字类型的实例。这使得程序的所有其余部分完全不需要任何关于模拟的知识,从而简化了模拟过程,同时还允许您通过实现新的模拟套接字类型来尝试许多不同的网络配置


这种想法是Twisted明确将“协议”(知道如何从网络中解释字节并生成新字节以发送到网络的对象)的想法与“传输”(知道如何从网络中获取字节并将字节放入网络的对象)分开的原因之一。这种分离简化了测试,并允许像这样的新配置,其中传输提供了一些其他网络条件的模拟(这可能很难真实产生)。

冒着不回答您提出的问题的风险,我会寻找在较低级别上实现这一点的软件

这是为Windows做的。我想我也能做到

是一个用于Linux的类似工具。开源。您可以将其导入Python程序


(另一个要考虑的事情是,你可能已经有了一个能够按照你想要的方式来形成流量的路由器。但是,这是一个相当大的依赖性,要添加到你的软件中,而且它可能需要更多的工作来配置。)< P/> < P>慢连接的模拟可以用Python包轻松实现:

pip install poorconn
例如,在下面的代码中,函数
client\u socket()
/
server\u socket()
返回一个client/server socket对象,该对象每发送1024字节的消息大约延迟2秒

从套接字导入套接字
在发送前从poorconn导入延迟,使套接字可修补
def client_socket():
s=套接字()
s=使插座可修补
发送前的延迟(s,2,1024)
返回s
def服务器_套接字():
s=套接字()
s=使插座可修补
在接收时发送之前延迟(s,2,1024)
返回s
然后,像使用普通套接字对象一样使用返回的套接字对象


免责声明:我是poorconn的主要作者。欢迎反馈。

你为什么要放慢速度?相关:这是一个困难的问题。。移动连接意味着更长的旅行时间/更多的包裹被丢弃等。仅仅以较慢的间隔发送它们并不是真正的模拟。@Terry:仅仅是为了有一个连接,通过它发送数据需要更长的时间。@克里斯托夫:是的,我读过这个问题,但我想把问题简单化
pip install poorconn