调通大部分lab3代码
This commit is contained in:
34
Labs/Lab3/src/Receiver.py
Normal file → Executable file
34
Labs/Lab3/src/Receiver.py
Normal file → Executable file
@@ -1,8 +1,9 @@
|
||||
import socket
|
||||
import random
|
||||
import re
|
||||
|
||||
class NetworkLayer:
|
||||
def __init__(self, host="0.0.0.0", port=31415) -> None:
|
||||
def __init__(self, host="172.29.68.245", port=23666) -> None:
|
||||
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
self.socket.connect((host, port))
|
||||
|
||||
@@ -10,11 +11,9 @@ class NetworkLayer:
|
||||
self.socket.send(data.encode())
|
||||
|
||||
def udt_rcv(self) -> str:
|
||||
while True:
|
||||
message = self.socket.recv(1024).decode("utf-8")
|
||||
return message
|
||||
message = self.socket.recv(1024).decode("utf-8")
|
||||
return message
|
||||
|
||||
|
||||
|
||||
class ApplicationLayer:
|
||||
def __init__(self) -> None:
|
||||
@@ -29,21 +28,31 @@ class Receiver:
|
||||
|
||||
def deliver_data(self, data, seq_num):
|
||||
if seq_num == self.expected_seq_num:
|
||||
print(f'成功收到seq_num={seq_num}, data={data}的包。')
|
||||
self.applicationLayer.data.append(data)
|
||||
self.udt_send(seq_num)
|
||||
self.expected_seq_num += 1
|
||||
else:
|
||||
print(f'收到seq_num={seq_num}, 与预期seq_num={self.expected_seq_num}不符。')
|
||||
self.udt_send(self.expected_seq_num - 1)
|
||||
|
||||
def udt_send(self, ack_num):
|
||||
if random.random() > 0.2:
|
||||
self.networkLayer.socket.send(str(ack_num).encode())
|
||||
print(f"发送ACK={ack_num}", end="")
|
||||
if random.random() > 0.25:
|
||||
self.networkLayer.socket.send((str(ack_num) + "\n").encode())
|
||||
else:
|
||||
print(",此包丢失。", end="")
|
||||
print()
|
||||
|
||||
def extract(self, message:str):
|
||||
parts = message.split(" ")
|
||||
seq_num = int(parts[0])
|
||||
data = parts[1]
|
||||
return seq_num, data
|
||||
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
|
||||
|
||||
if __name__ == "__main__":
|
||||
networkLayer = NetworkLayer()
|
||||
@@ -53,6 +62,7 @@ if __name__ == "__main__":
|
||||
message = networkLayer.udt_rcv()
|
||||
if message:
|
||||
seq_num, data = receiver.extract(message)
|
||||
receiver.deliver_data(data, seq_num)
|
||||
if data:
|
||||
receiver.deliver_data(data, seq_num)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user