gpt4 book ai didi

python - 在python中模拟慢速网络的简单方法

转载 作者:太空狗 更新时间:2023-10-29 22:07:20 24 4
gpt4 key购买 nike

场景。我有一个客户端有两个到服务器的网络连接。一个连接使用手机,一个是使用wlan连接。

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

但是是否有更好的减速方法?也许通过发送更小的数据包,这意味着我需要发送更多数据?

关于减慢其中一个连接的好方法有什么想法吗?

Orjanp

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

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()

最佳答案

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

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

import time, socket

class ControllableSocket:
def __init__(self, latency, bandwidth):
self._latency = latency
self._bandwidth = bandwidth
self._bytesSent = 0
self._timeCreated = time.time()
self._socket = socket.socket()

def send(self, bytes):
now = time.time()
connectionDuration = now - self._timeCreated
self._bytesSent += len(bytes)
# How long should it have taken to send how many bytes we've sent with our
# given bandwidth limitation?
requiredDuration = self._bytesSent / self._bandwidth
time.sleep(max(requiredDuration - connectionDuration, self._latency))
return self._socket.send(bytes)

如果您实现了其他套接字方法、connect、recv 等,您可以用此类的实例替换真正的套接字类型的实例。这让您的程序的所有其余部分完全没有您的模拟的任何知识,简化了它,同时还让您通过实现一个模拟它们的新套接字类型来尝试许多不同的网络配置。

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

关于python - 在python中模拟慢速网络的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1833563/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com