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