lab3完成代码部分

This commit is contained in:
typingbugs
2024-04-04 20:14:14 +08:00
parent eab9b922b5
commit 2de63a3dc8
2 changed files with 123 additions and 97 deletions

View File

@@ -1,18 +1,22 @@
import socket
import random
import re
import time
class NetworkLayer:
def __init__(self, host="172.29.68.245", port=23666) -> None:
def __init__(self, host:str, port:int) -> None:
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect((host, port))
print("下层的不可靠传输连接成功,等待发送方传输。")
def udt_send(self, data:str):
self.socket.send(data.encode())
def udt_rcv(self) -> str:
message = self.socket.recv(1024).decode("utf-8")
message = self.socket.recv(12).decode("utf-8")
return message
def close(self):
self.socket.close()
class ApplicationLayer:
@@ -22,13 +26,13 @@ class ApplicationLayer:
class Receiver:
def __init__(self, networkLayer:NetworkLayer, applicationLayer:ApplicationLayer):
self.expected_seq_num = 0
self.expected_seq_num = 1
self.networkLayer = networkLayer
self.applicationLayer = applicationLayer
def deliver_data(self, data, seq_num):
if seq_num == self.expected_seq_num:
print(f'成功收到seq_num={seq_num}, data={data}的包。')
print(f'成功收到seq_num={seq_num}, data=\"{data}\"的包。')
self.applicationLayer.data.append(data)
self.udt_send(seq_num)
self.expected_seq_num += 1
@@ -39,30 +43,28 @@ class Receiver:
def udt_send(self, ack_num):
print(f"发送ACK={ack_num}", end="")
if random.random() > 0.25:
self.networkLayer.socket.send((str(ack_num) + "\n").encode())
self.networkLayer.socket.send("{:0>4d}".format(ack_num).encode())
else:
print(",此包丢失。", end="")
print()
def extract(self, message:str):
try:
parts = message.split(" ")
seq_num = int(parts[0])
data = parts[1]
return seq_num, data
except Exception as e:
print(e)
return None, None
seq_num = int(message[:3])
data = message[4:]
return seq_num, data
if __name__ == "__main__":
networkLayer = NetworkLayer()
max_seq_num = 20
networkLayer = NetworkLayer(host="172.29.68.245", port=23666)
applicationLayer = ApplicationLayer()
receiver = Receiver(networkLayer, applicationLayer)
while True:
message = networkLayer.udt_rcv()
if message:
seq_num, data = receiver.extract(message)
if data:
receiver.deliver_data(data, seq_num)
receiver.deliver_data(data, seq_num)
if receiver.expected_seq_num == max_seq_num:
break
print("序列传输完成。")
networkLayer.close()