帮我完善一下代码:使用FlowID=1、权重=1和数据包大小1024启动发送端。几秒钟后,使用FlowID=2、权重=1和数据包大小512启动另一个发送器。再过几秒钟,使用FlowID=3、权重=2和数据包大小1024启动第三个发送方。具体要求:1.接收者在"sender.py"中写三个线程,并且规定有:source ip,3个线程开启的source port,destination ip,3个destination port,router ip,发送的信息可以随意生成。2.在router.py中就是接收到sender发送的数据并且根据WFQ算法调度接收到的数据包并转发给receiver。3.在"receiver.py"中,接收消息并进行数据统计,每次完成一个数据包时记录时间、流ID和数据包的大小,最后画出每个流上接收到的总字节与时间的图表。
时间: 2024-03-16 19:43:47 浏览: 157
opentracing-toolbox:同类最佳的OpenTracing实用程序,工具和扩展
好的,根据您的要求,我为您提供一个完整的代码实现,其中包括sender.py、router.py和receiver.py三个文件。请注意,这是一个比较完整的实现,包括了多线程、流的统计和绘图等功能,您可以根据需要进行修改和调整。
sender.py:
```python
import socket
import time
import threading
import random
class Sender:
def __init__(self, host, port, weight, data_size, flow_id):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.connect((host, port))
self.weight = weight
self.data_size = data_size
self.flow_id = flow_id
self.lock = threading.Lock()
def send(self):
while True:
data = self.generate_data()
self.lock.acquire()
self.sock.sendall(data.encode())
self.lock.release()
time.sleep(self.weight)
def generate_data(self):
return f"FlowID: {self.flow_id}, DataSize: {self.data_size}, Data: {''.join(random.choices('abcdefghijklmnopqrstuvwxyz', k=self.data_size))}"
```
router.py:
```python
import socket
import threading
from collections import deque
class Router:
def __init__(self, host, port, capacity):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.bind((host, port))
self.sock.listen(5)
self.capacity = capacity
self.queue = deque()
self.lock = threading.Lock()
self.stats = {}
def serve(self):
threading.Thread(target=self.send).start()
while True:
conn, addr = self.sock.accept()
threading.Thread(target=self.handle_client, args=(conn, addr)).start()
def handle_client(self, conn, addr):
while True:
data = conn.recv(1024)
if not data:
break
self.lock.acquire()
self.queue.append((data.decode(), addr))
self.lock.release()
def send(self):
while True:
if len(self.queue) > 0:
self.lock.acquire()
data, addr = self.queue.popleft()
self.lock.release()
flow_id = int(data.split(',')[0].split(': ')[1])
if flow_id not in self.stats:
self.stats[flow_id] = {'time': [], 'size': []}
self.stats[flow_id]['time'].append(time.time())
self.stats[flow_id]['size'].append(int(data.split(',')[1].split(': ')[1]))
if len(data) <= self.capacity:
self.send_to_receiver(data, addr)
else:
self.split_packets(data, addr)
def send_to_receiver(self, data, addr):
receiver_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
receiver_sock.connect(addr)
receiver_sock.sendall(data.encode())
receiver_sock.close()
def split_packets(self, data, addr):
packet_num = len(data) // self.capacity
if len(data) % self.capacity != 0:
packet_num += 1
for i in range(packet_num):
packet = data[i * self.capacity: (i+1) * self.capacity]
self.lock.acquire()
self.queue.append((packet, addr))
self.lock.release()
```
receiver.py:
```python
import socket
import threading
import matplotlib.pyplot as plt
class Receiver:
def __init__(self, host, port):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.bind((host, port))
self.sock.listen(5)
self.stats = {}
self.lock = threading.Lock()
def serve(self):
threading.Thread(target=self.plot_graph).start()
while True:
conn, addr = self.sock.accept()
threading.Thread(target=self.handle_client, args=(conn, addr)).start()
def handle_client(self, conn, addr):
while True:
data = conn.recv(1024)
if not data:
break
flow_id = int(data.split(',')[0].split(': ')[1])
size = int(data.split(',')[1].split(': ')[1])
self.lock.acquire()
if flow_id not in self.stats:
self.stats[flow_id] = {'time': [], 'size': []}
self.stats[flow_id]['time'].append(time.time())
self.stats[flow_id]['size'].append(size)
self.lock.release()
def plot_graph(self):
while True:
if len(self.stats) > 0:
self.lock.acquire()
fig, ax = plt.subplots()
for flow_id in self.stats:
ax.plot(self.stats[flow_id]['time'], self.stats[flow_id]['size'], label=f"Flow {flow_id}")
ax.legend()
ax.set_xlabel('Time')
ax.set_ylabel('Total Bytes')
plt.show()
self.lock.release()
time.sleep(5)
```
在主程序中,您可以使用以下代码来启动三个发送方和一个接收方:
```python
if __name__ == '__main__':
router = Router('localhost', 8888, 1024)
receiver = Receiver('localhost', 8889)
sender1 = Sender('localhost', 8888, 1, 1024, 1)
sender2 = Sender('localhost', 8888, 1, 512, 2)
sender3 = Sender('localhost', 8888, 2, 1024, 3)
threading.Thread(target=router.serve).start()
threading.Thread(target=receiver.serve).start()
threading.Thread(target=sender1.send).start()
threading.Thread(target=sender2.send).start()
threading.Thread(target=sender3.send).start()
```
请注意,在本示例中,发送方会随机生成一些字符,用于模拟数据包的内容。您可以根据实际需求进行修改。另外,为了方便起见,在本例中,数据包大小和权重都是固定的,您也可以根据实际需求进行修改。
阅读全文