예제 #1
0
 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())
예제 #2
0
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}")
예제 #3
0
 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)
예제 #4
0
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)
예제 #5
0
 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]
예제 #6
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()
예제 #7
0
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