def handle(self): # self.request is the TCP socket connected to the client self.data = socket_utils.recv(self.request).strip() print "%s wrote:" % self.client_address[0] print self.data # just send back the same data, but upper-cased socket_utils.send(self.request, self.data.upper())
def get(client_socket, e_socket, filename): # create the header header = create_header(len(filename), Command.GET) # send the header and filename client_socket.send(bytes(header + filename, 'utf-8')) # get the header header = client_socket.recv(HEADER_LENGTH).decode('utf-8') # parse the header file_size, cmd = parse_header(header) # error if file not found if cmd == Command.ERROR: print('File does not exist on server') return # receieve file data from server raw_data = recv(e_socket, file_size) # get filename from data filename = raw_data[:raw_data.index('*')] # get data from data data = raw_data[raw_data.index('*') + 1:] # write to file f = open(filename, 'w') f.write(data) f.close() print(f"Filename: {filename}, Bytes Transferred: {file_size}")
def recv(cls, socket): # read the packet's length length = cls._read_len(socket) # receive the whole packet (without the length) packet = socket_utils.recv(socket, length) # decode the packet type, leave payload as is ptype = struct.unpack("B", packet[0])[0] payload = packet[1:] if length >= 2 else '' return cls(ptype, payload)
def ls(client_socket, e_socket): # create the header header = create_header(0, Command.LS) # sends the header to the server client_socket.send(bytes(header, 'utf-8')) # receive the header from the server header = recv(e_socket, HEADER_LENGTH) # parse the header data file_size, cmd = parse_header(header) # receive the data from the server data_raw = recv(e_socket, file_size) # split the data by spaces data = data_raw.split() # print data to console for d in data: print(d)
def _read_len(cls, sock): # the first byte of the packet should indicate its length len_encoded = socket_utils.recv(sock, 4) return struct.unpack("<I", len_encoded)[0]
header = main_socket.recv(HEADER_LENGTH).decode('utf-8') # parse the header from the client try: data_size, cmd = parse_header(header) except ValueError: continue # check if the command needs the empherical port if cmd != Command.QUIT: # accept a connection through the ephemeral socket conn_socket, addr = e_socket.accept() print(f'{addr[0]}:{addr[1]} has connected on the ephemeral port') if cmd == Command.GET: filename = recv(main_socket, data_size) success = get(main_socket, conn_socket, filename) if success: print("GET Success") else: print("GET Failure") elif cmd == Command.PUT: # receive data from the client raw_data = recv(conn_socket, data_size) put(raw_data) print("PUT Success") elif cmd == Command.LS: ls(conn_socket) print("LS Success") elif cmd == Command.QUIT: main_socket.close()
import socket import sys import socket_utils HOST, PORT = "localhost", 9999 data = " ".join(sys.argv[1:]) # Create a socket (SOCK_STREAM means a TCP socket) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Connect to server and send data sock.connect((HOST, PORT)) socket_utils.send(sock, data + "\n") # Receive data from the server and shut down received = socket_utils.recv(sock) sock.close() print "Sent: %s" % data print "Received: %s" % received