diff --git a/client.py b/client.py index 4da536f07e2ed58d8f78e5876b00c324a0b29756..321b6613fea47d8675c68eead0e034d5f5e9ea11 100644 --- a/client.py +++ b/client.py @@ -67,6 +67,64 @@ class Client(): def recv_file(self): # To-Do + rcvd = Segment() + + base = 0 # antrian ngirim data + data_ret = b'' + + log("!", f"Waiting for server to send data") + + while True: + data, server_addr = self.recv() # nerima data dari server + file_received = self.FILEPATH # deklarasi buat tempat penyimpanan berkas + rcvd.from_bytes(data) # unwrap the data + + if rcvd.test_checksum() and rcvd.get_seq_no == base: # untuk ngecek valid checksumnya dan memastikan ini urutan awal + + if rcvd.isData(): # check jika segmennya bertipe data + ack_segment = Segment() + ack_segment.setACK() + ack_segment.set_seq_no(0) + ack_segment.set_ack_no(rcvd.get_seq_no+1) + self.send(ack_segment.to_bytes(), server_addr) + + log(f"Segment SEQ={rcvd.get_seq_no()}: Received {rcvd.isData()}, Sent {ack_segment.getACK()}") + + data_ret += ack_segment.get_data() + + else: + log(f"Data is empty") + + base += 1 + + elif rcvd.getFIN(): + finack_segment = Segment() + finack_segment.set_seq_no(0) + finack_segment.set_ack_no(0) + finack_segment.setFIN() + finack_segment.setACK() + self.send(finack_segment.to_bytes(), server_addr) + break + + elif not rcvd.test_checksum() or rcvd.get_seq_no() > base: + refuse_segment = Segment() + refuse_segment.set_seq_no(0) + refuse_segment.set_ack_no(base) + refuse_segment.setSYN() + self.send(refuse_segment.to_bytes(), server_addr) + + log("!", f"WARNING!!! Segment refused") + + elif rcvd.get_seq_no < base: + ack_segment = Segment() + ack_segment.set_seq_no(0) + ack_segment.set_ack_no(base) + ack_segment.getACK() + self.send(ack_segment.to_bytes(), server_addr) + + log("!", f"WARNING!!! Segment already received") + + # ini mau void apa mau return data_ret yakk wkwkkwkwkwkwk return def close_con(self): @@ -75,7 +133,7 @@ class Client(): byte, _ = self.recv() rcvd = Segment().from_bytes(byte) - if (not rcvd.test_checksum) or (not rcvd.getFIN): + if (not rcvd.test_checksum()) or (not rcvd.getFIN()): raise ConnectionError seg = Segment(300, rcvd.get_seq_no()) seg.setACK() @@ -89,10 +147,11 @@ class Client(): byte, _ = self.recv() rcvd = Segment().from_bytes(byte) - if (not rcvd.test_checksum) or (not rcvd.getACK) \ - or (not rcvd.get_ack_no != seg.get_seq_no): + if (not rcvd.test_checksum()) or (not rcvd.getACK()) \ + or (rcvd.get_ack_no() != seg.get_seq_no()): raise ConnectionError log(f"Segment SEQ={seg.get_seq_no()}, FIN", "Acked") + # self.socket.close() return if __name__=="__main__": diff --git a/server.py b/server.py index 6bf238a80edeafb4729c54852a2b21a9ff6f4ca4..0240bccd0b92b4b74dcc55c74022d248f3c87dc6 100644 --- a/server.py +++ b/server.py @@ -5,7 +5,7 @@ from common import * class Server(): - def __init__(self, port=10000, filepath="input"): + def __init__(self, port=10000, filepath="data/halo.txt"): self.SERVER_PORT = port self.FILE_PATH = filepath self.clients = [] @@ -14,7 +14,7 @@ class Server(): self.listen() for client in self.clients : self.handshake(client) - self.send_file(client) + # self.send_file(client) self.close_con(client) def init_socket(self): @@ -23,7 +23,10 @@ class Server(): self.socket.bind((HOST_NAME, self.SERVER_PORT)) def send(self, data, client_addr): - self.socket.sendto(data, client_addr) + if(type(data) == str): + self.socket.sendto(str.encode(data), client_addr) + else: + self.socket.sendto(data, client_addr) def recv(self): return self.socket.recvfrom(SEG_SIZE) @@ -81,7 +84,7 @@ class Server(): def send_file(self, client_addr): # To-Do - file_size = os.path.getSize(self.FILE_PATH) + file_size = os.path.getsize(self.FILE_PATH) with open(self.FILE_PATH, "rb") as f: file = f.read() @@ -94,6 +97,8 @@ class Server(): self.send(self.FILE_PATH + f"-{file_size}", client_addr) log("!", "File path and size sent") + print() + return True def close_con(self, client_addr): @@ -126,6 +131,6 @@ class Server(): if __name__=="__main__": try: - Server(port=sys.argv[1]); + Server(port=sys.argv[1], filepath=sys.argv[2]); except: Server(); \ No newline at end of file