from threading import Thread, Lock from encapFramedSock import EncapFramedSock switchesVarDefaults = ( (('-l', '--listenPort'), 'listenPort', 50001), (('-d', '--debug'), 'debug', False), (('-?', '--usage'), 'usage', False), (('-c', '--connections'), 'maxConnections', 5) ) def destroyParams(debug, listenPort, usage, maxConnections): return debug, listenPort, usage, maxConnections # destructing dictionary currentFile = {} # dictionary needed to tell which file is in use debug, listenPort, usage, maxConnections = destroyParams(**params.parseParams(switchesVarDefaults)) if usage: params.usage() lsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) bindAddr = ('127.0.0.1', int(listenPort)) lsock.bind(bindAddr) lsock.listen(maxConnections) print('listening on:', bindAddr) lock = Lock() class Server(Thread): def __init__(self, sockAddr): Thread.__init__(self) self.sock, self.addr = sockAddr self.fsock = EncapFramedSock(sockAddr)
sys.path.append("../lib") # for params import params from framedSock import framedSend, framedReceive switchesVarDefaults = ( (('-s', '--server'), 'server', "127.0.0.1:50001"), (('-d', '--debug'), "debug", False), # boolean (set if present) (('-?', '--usage'), "usage", False), # boolean (set if present) ) progname = "framedClient" paramMap = params.parseParams(switchesVarDefaults) server, usage, debug = paramMap["server"], paramMap["usage"], paramMap["debug"] if usage: params.usage() try: serverHost, serverPort = re.split(":", server) serverPort = int(serverPort) except: print("Can't parse server:port from '%s'" % server) sys.exit(1) s = None
def client(): switchesVarDefaults = ( (('1', '--server'), 'server', "127.0.0.1:50001"), (('?', '--usage'), 'usage', False), (('d', '--debug'), 'debug', False), ) parameterMap = params.parseParams(switchesVarDefaults) server, usage = parameterMap['server'], parameterMap['usage'] if usage: params.usage() try: serverHost, serverPort = re.split(":", server) serverPort = int(serverPort) except: print("Can't parse server:port from '%s'" % server) sys.exit(1) port = (serverHost, serverPort) # create socket listenSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) listenSocket.connect(port) encapSocket = EncapFramedSock((listenSocket, port)) while 1: fileName = input("Enter a filename > ") fileName.strip() if fileName == "exit": # terminate sys.exit(0) else: if not fileName: continue elif os.path.exists(PATH + fileName): f = open(PATH + fileName, "rb") contents = f.read() if len(contents) < 1: print("Error: File %s is empty" % fileName) continue print("encapSocket Before ********") encapSocket.send(fileName, contents) print("encapSocket After *********") # check if server captured and receive the file status = encapSocket.Status() status = int(status.decode()) if status: print("File %s received by server." % fileName) sys.exit(0) else: print( "File Transfer Error: File %s was not received by server." % fileName) sys.exit(1) else: print("File Not Found Error: File %s not found!" % fileName)
def send_file(): switchesVarDefaults = ( (('-s', '--server'), 'server', "127.0.0.1:50000"), (('-f', '--file'), 'filename', 'testfile'), (('-r', '--remote'), 'filename_r','testfile'), (('-d', '--debug'), "debug", False), (('-?', '--usage'), "usage", False), # boolean (set if present) ) progname = "file_transfer_client" paramMap = params.parseParams(switchesVarDefaults) server, usage, filename, debug, filename_r = paramMap["server"], paramMap["usage"], paramMap["filename"], paramMap["debug"], paramMap["filename_r"] #Getting parameters usage from args if usage: params.usage() try: #Tries to parse server name serverHost, serverPort = re.split(":", server) serverPort = int(serverPort) except: print("Can't parse server:port from '%s'" % server) sys.exit(1) addrFamily = socket.AF_INET #Creates socket socktype = socket.SOCK_STREAM addrPort = (serverHost, serverPort) sock = socket.socket(addrFamily, socktype) if sock is None: #If cannot open socket print("Could not open socket!") sys.exit(1) sock.connect(addrPort) if os.stat(filename).st_size == 0: #Checks if file is empty and rejects it print("No zero length files allowed. Try again.") sock.close() sys.exit(1) file_size = os.path.getsize(filename) #Gets file size if filename_r == "testfile": #If remote usage is default filename_r = filename framedSend(sock, bytes(filename_r + ":" + str(file_size), 'utf-8'), debug) #Sends filename to server file_exists = framedReceive(sock, debug) #Gets response from server if file exists print("Sending file: '" + filename + "', Remote name: '" + filename_r + "'") if file_exists == b'1': #If file exists on server print("File exists. Will override...") try: with open(filename, 'rb') as file: #Opens file to read while True: data = file.read(16384) #Reads file by 16384 bytes (16kB) framedSend(sock, data, debug) #Sends data if not data: #Breaks if data is None type break data_sent = framedReceive(sock, debug) #Saves server response if data != data_sent: #Checks if response from the server is a complete message print("Transfer failed! Connection was dropped or file active.") file.close() sock.close() sys.exit(0) if debug: print("Data sent: ", data_sent) print("File: '" + filename + "' sent!") file.close() #Closes file reader except FileNotFoundError: #If file is not found print("File not found. Try again.") sock.close()
def client(): switchesVarDefaults = ( (('-s', '--server'), 'server', "127.0.0.1:50001"), (('-d', '--debug'), "debug", False), # boolean (set if present) (('-?', '--usage'), "usage", False), # boolean (set if present) ) paramMap = params.parseParams(switchesVarDefaults) server, usage, debug = paramMap["server"], paramMap["usage"], paramMap[ "debug"] if usage: params.usage() try: serverHost, serverPort = re.split(":", server) serverPort = int(serverPort) except: print("can't parse server:port from '%s'" % server) sys.exit(1) addr_port = (serverHost, serverPort) # create socket object listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) listen_socket.connect(addr_port) # create encapsulated socket encap_socket = EncapFramedSock((listen_socket, addr_port)) while True: filename = input("Enter the file to be sent: ") filename.strip() if filename == "exit": sys.exit(0) else: if not filename: continue elif os.path.exists(PATH_FILES + filename): # open file and read file = open(PATH_FILES + filename, "rb") file_content = file.read() # verify file is not empty before sending if len(file_content) < 1: print(EMPTY_MSG % filename) continue # send file contents to server encap_socket.send(filename, file_content, debug) # check if server received file status = encap_socket.get_status() status = int(status.decode()) # successful transfer if status: print(CONFIRM_MSG % filename) #sys.exit(0) # failed transfer else: print(REJECT_MSG % filename) sys.exit(1) # file not found else: print("ERROR: file %s not found. Try again" % filename)
"Wrong use of command or params, to send a file please use the following notation: ./fileClient.py put <sourceFile> <destinationFile> [params]" ) sys.exit(0) putIndex = sys.argv.index('put') put, source, destination = True, sys.argv[putIndex + 1], sys.argv[putIndex + 2] newArgv = sys.argv newArgv.remove('put') newArgv.remove(source) newArgv.remove(destination) sys.argv = newArgv #resetting argv so that there are no errors when checking for params import params # has to be imported until here since params runs code when imported therefore argv needs to be dealt with before importing. server, debug, usage, proxy = destroyParams( **params.parseParams(switchesVarDefaults)) if usage: params.usage() if put: try: serverHost, serverPort = re.split( ':', ('127.0.0.1:50000' if proxy else server)) serverPort = int(serverPort) except: print("Can't parse server:port from '%s'" % server) sys.exit(1) addrPort = (serverHost, serverPort) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
import os import statvfs # defaults for command line arguments for the program # format ((short switch, long switch), variable name, default value) switches_var_defaults = ( (('-l', '--listen-port'), 'listen_port', 50001), # port to listen for connections (('-d', '--debug'), 'debug', False), # run script in debig mode. boolean (set if present) (('-?', '--usage'), 'usage', False ) # displays command line arguments. boolean (set if present) ) # send passed command line arguments to the parser param_map = params.parseParams(switches_var_defaults) # assign command line agruments to variables listen_port = param_map["listen_port"] usage = param_map["usage"] debug = param_map["debug"] # print usage if usage: params.usage() # cast listen port to integer try: listen_port = int(listen_port) except: print "Can't parse listen port from %s" % listen_port