From 3764a5e8d3c488e7488a1439bea34a9ac54ff5e7 Mon Sep 17 00:00:00 2001 From: Yorkio Date: Thu, 24 Nov 2016 00:01:26 +0200 Subject: [PATCH] Add files via upload --- GUIv10.0.py | 434 ++++++++++++++++++++++++++++++++++++++++++++++ server_CE.v9.0.py | 228 ++++++++++++++++++++++++ 2 files changed, 662 insertions(+) create mode 100644 GUIv10.0.py create mode 100644 server_CE.v9.0.py diff --git a/GUIv10.0.py b/GUIv10.0.py new file mode 100644 index 0000000..be6bd01 --- /dev/null +++ b/GUIv10.0.py @@ -0,0 +1,434 @@ +import os +import tkMessageBox +from Tkinter import * +from ScrolledText import * +from socket import AF_INET, SOCK_STREAM, socket, SHUT_WR +from os.path import basename +import threading +from time import sleep + + +socket = socket(AF_INET, SOCK_STREAM) +HOME_DIR = os.getcwd() +#DESTINATION = ('192.168.43.27', 7777) +DESTINATION = ('127.0.0.1', 5595) +BUFFER_LENGTH = 1024 +socket.connect(DESTINATION) + + +def edit(tb, fn, message): + print "Current edition:", message + if message == 'Finished': + return + message = message.split(' ') + if fn != message[0]: + return + fn = message[0] + f = None + try: + if message[1] == '1': + element = message[2] + line = int(message[3]) - 1 + position = int(message[4]) + f = open(fn, 'r') + lines = f.readlines() + f.close() + while line >= len(lines): + lines.append('\n') + lines[line] = lines[line][:position] + element + lines[line][position:] + f = open(fn, 'w') + for l in lines: + f.write(l) + print lines, 'ya zapisal' + f.close() + + + elif message[1] == '0': + line = int(message[2]) - 1 + position = int(message[3]) + f = open(fn, 'r') + lines = f.readlines() + f.close() + if line < len(lines): + lines[line] = lines[line][:position] + lines[line][position + 1:] + f = open(fn, 'w') + for l in lines: + f.write(l) + f.close() + + elif message[1] == '3': + element = ' ' + line = int(message[2]) - 1 + position = int(message[3]) + f = open(fn, 'r') + lines = f.readlines() + f.close() + while line >= len(lines): + lines.append('\n') + lines[line] = lines[line][:position] + element + lines[line][position:] + f = open(fn, 'w') + for l in lines: + f.write(l) + f.close() + + elif message[1] == '4': + element = '\n' + line = int(message[2]) - 1 + position = int(message[3]) + f = open(fn, 'r') + lines = f.readlines() + f.close() + while line >= len(lines): + lines.append('\n') + lines[line] = lines[line][:position] + element + lines[line][position:] + f = open(fn, 'w') + for l in lines: + f.write(l) + f.close() + + except Exception as e: + print "Exception:", e + + finally: + f = open(fn, 'r') + data = f.read() + f.close() + tb.delete('1.0', END) + tb.insert('1.0', data) + #action = message[1] + if message[1] == '1': + tb.mark_set(INSERT, str(line + 1) + '.' + str(position + 1)) + elif message[1] == '0': + tb.mark_set(INSERT, str(line + 1) + '.' + str(position)) + elif message[1] == '3': + tb.mark_set(INSERT, str(line + 1) + '.' + str(position + 1)) + + +def edit_localy(tb, fn, message): + print "Current edition:", message + message = message.split(' ') + f = None + try: + if message[0] == '1': + element = message[1] + line = int(message[2]) - 1 + position = int(message[3]) + f = open(fn, 'r') + lines = f.readlines() + f.close() + while line >= len(lines): + lines.append('\n') + lines[line] = lines[line][:position] + element + lines[line][position:] + f = open(fn, 'w') + for l in lines: + f.write(l) + print lines, 'ya zapisal' + f.close() + + + elif message[0] == '0': + line = int(message[1]) - 1 + position = int(message[2]) + f = open(fn, 'r') + lines = f.readlines() + f.close() + if line < len(lines): + lines[line] = lines[line][:position] + lines[line][position + 1:] + f = open(fn, 'w') + for l in lines: + f.write(l) + f.close() + + elif message[0] == '3': + element = ' ' + line = int(message[1]) - 1 + position = int(message[2]) + f = open(fn, 'r') + lines = f.readlines() + f.close() + while line >= len(lines): + lines.append('\n') + lines[line] = lines[line][:position] + element + lines[line][position:] + f = open(fn, 'w') + for l in lines: + f.write(l) + f.close() + + elif message[0] == '4': + element = '\n' + line = int(message[1]) - 1 + position = int(message[2]) + f = open(fn, 'r') + lines = f.readlines() + f.close() + while line >= len(lines): + lines.append('\n') + lines[line] = lines[line][:position] + element + lines[line][position:] + f = open(fn, 'w') + for l in lines: + f.write(l) + f.close() + + except Exception as e: + print "Exception:", e + + finally: + f = open(fn, 'r') + data = f.read() + f.close() + tb.delete('1.0', END) + tb.insert('1.0', data) + #action = message[1] + if message[0] == '1': + tb.mark_set(INSERT, str(line + 1) + '.' + str(position + 1)) + elif message[0] == '0': + tb.mark_set(INSERT, str(line + 1) + '.' + str(position)) + elif message[0] == '3': + tb.mark_set(INSERT, str(line + 1) + '.' + str(position + 1)) + +def listen_server(tb, fn): + m = '' + while m != 'Terminated' and m != 'Finished': + m = socket.recv(BUFFER_LENGTH) + edit(tb, fn, m) + + +def receive_file(f): + filename = os.path.join(HOME_DIR, f) + with open(filename, 'w') as f: + mess = '' + while not mess.endswith('\n'): + m = socket.recv(BUFFER_LENGTH) + mess += m + f.write(mess) + + +class Editor: + def __init__(self, root): + self.active_filename = None + + # Create a label that shows the current file editing + self.filename_label = Label(root, text='No file specified!', fg='dark violet', font=('times', 18, 'italic')) + self.filename_label.pack() + frame = Frame(root) + frame.pack() + frame.configure(background='black') + root.title("Editor") + # Create a text frame + self.textPad = ScrolledText(root, width=60, height=30) + self.textPad.pack() + + # Create an open button + self.open_button = Button(frame, text='Open', width=21, fg='blue', command=self.open_command) + self.open_button.pack(padx=5, pady=5, side=LEFT) + + # Create a create button + self.edit_button = Button(frame, text='Create', width=21, fg='blue', command=self.create_command) + self.edit_button.pack(padx=5, pady=5, side=LEFT) + + # Create a close button + self.close_button = Button(frame, text='Close', width=21, fg='red', command=self.exit_command) + self.close_button.pack(padx=5, pady=5, side=LEFT) + self.textPad.bind('', self.input_event) + self.textPad.bind('', self.backspace_event) + self.textPad.bind('', self.delete_event) + self.textPad.bind('', self.space_event) + self.textPad.bind('', self.enter_event) + + def enter_event(self, event): + print "To server sent:", '4' + ' ' + ' '.join(self.textPad.index(INSERT).split('.')) + edition = '4' + ' ' + ' '.join(self.textPad.index(INSERT).split('.')) + socket.send(edition) + edit_localy(self.textPad, self.active_filename, edition) + sleep(0.02) + + # Capture delete button click event + def delete_event(self, event): + print "To server sent:", '0' + ' ' + ' '.join(self.textPad.index(INSERT).split('.')) + edition = '0' + ' ' + ' '.join(self.textPad.index(INSERT).split('.')) + socket.send(edition) + edit_localy(self.textPad, self.active_filename, edition) + sleep(0.02) + + def space_event(self, event): + print "To server sent:", '3' + ' ' + ' '.join(self.textPad.index(INSERT).split('.')) + edition = '3' + ' ' + ' '.join(self.textPad.index(INSERT).split('.')) + socket.send(edition) + edit_localy(self.textPad, self.active_filename, edition) + sleep(0.02) + + # Capture backspace button click event + def backspace_event(self, event): + line, column = self.textPad.index(INSERT).split('.') + line, column = int(line), int(column) - 1 + print "To server sent:", '0' + ' ' + str(line) + ' ' + str(column) + edition = '0' + ' ' + str(line) + ' ' + str(column) + socket.send(edition) + edit_localy(self.textPad, self.active_filename, edition) + sleep(0.02) + + + # Capture a keyboard click event + def input_event(self, event): + char = event.char + special_digits = ['.', ',', '!', '?', '-', ':', ';', '"', "'", "\t", '!', '@', '#', '$', '%', + '^', '&', '*', '(', ')', '_', '+', '=', '`', '/', '<', '>', '\\'] + if char.isalpha() or char.isdigit() or char in special_digits: + print "To server sent:", '1' + ' ' + char + ' ' + ' '.join(self.textPad.index(INSERT).split('.')) + edition = '1' + ' ' + char + ' ' + ' '.join(self.textPad.index(INSERT).split('.')) + socket.send(edition) + edit_localy(self.textPad, self.active_filename, edition) + sleep(0.02) + else: + return + + # Exit from tk + def exit_command(self): + if tkMessageBox.askokcancel("Quit", "Are you sure?"): + socket.send('Terminated') + root.destroy() + socket.shutdown(1) + socket.close() + + # Open file + def open_command(self): + print "Open existing file" + if self.active_filename is not None: + socket.send('Finished') + socket.send('Open/Edit file') + print '1' + list_of_files = socket.recv(BUFFER_LENGTH) + print list_of_files, 'list of files' + if list_of_files == 'empty': + print 'empty' + tkMessageBox.showerror('No files on the server yet', "Be the first to create new file!") + socket.sendall('Finished') + return + + elif list_of_files == 'Finished': + print 'finished' + list_of_files = socket.recv(BUFFER_LENGTH) + + elif ';;;' not in list_of_files and '.txt' not in list_of_files: + print ';;;' + list_of_files = socket.recv(BUFFER_LENGTH) + + elif '.txt' not in list_of_files: + print 'no txt in file' + list_of_files = socket.recv(BUFFER_LENGTH) + print 'Go next' + # Create a child window + self.lb = Toplevel(root) + self.lb.title("Choose a file") + self.lb.geometry('300x100') + + # Create a listbox + self.listbox = Listbox(self.lb) + + def ret(): + socket.sendall('Finished') + self.lb.destroy() + + self.lb.protocol("WM_DELETE_WINDOW", ret) + + def select_file(event): + widget = event.widget + selection = widget.curselection() + value = widget.get(selection[0]) + self.active_filename = value + + # Send a filename to download + socket.sendall(self.active_filename) + + # Download a filename + receive_file(self.active_filename) + self.filename_label.config(text='Editing: ' + basename(self.active_filename)) + f = open(self.active_filename, 'r') + data = f.read() + self.textPad.delete('1.0', END) + self.textPad.insert('1.0', data) + f.close() + self.lb.destroy() + + t = threading.Thread(target=listen_server, args=(self.textPad, self.active_filename, )) + t.setDaemon(True) + t.start() + + for f in list_of_files.split(';;;'): + self.listbox.insert("end", f) + + self.lb.bind("", select_file) + self.listbox.pack(fill='both', expand=True) + + + def create_command(self): + print "Create new file" + + if self.active_filename is not None: + socket.sendall('Finished') + print 'lol' + + socket.send('Create new file') + + # Create a child window + self.child = Toplevel(root) + self.child.title("Create a file") + self.child.geometry('250x75') + + def ret(): + socket.sendall('Finished') + self.child.destroy() + + + self.child.protocol("WM_DELETE_WINDOW", ret) + # Create a label + Label(self.child, text='Enter a filename',).grid(row=0, padx=5) + + # Create an entry widget for a filename input + entry_filename = Entry(self.child) + entry_filename.grid(row=0, column=1) + + def get_filename(): + self.active_filename = entry_filename.get() + if not self.active_filename: + return + + self.active_filename = self.active_filename.replace(' ', '_') + + if '.txt' not in self.active_filename: + self.active_filename += '.txt' + + # If a filename is empty + if not self.active_filename: + return + + # Check if a filename is free + print "File name:", self.active_filename + socket.sendall(self.active_filename) + response = socket.recv(BUFFER_LENGTH) + print "Response:", response + if response == '1': + tkMessageBox.showerror('Filename conflict', "File with a name: " + self.active_filename + + ' is already exists!') + + self.child.destroy() + self.active_filename = None + return + # Create a file + open(self.active_filename, 'a').close() + self.filename_label.config(text='Editing: ' + basename(self.active_filename)) + self.textPad.delete('1.0', END) + self.child.destroy() + + t1 = threading.Thread(target=listen_server, args=(self.textPad, self.active_filename, )) + t1.setDaemon(True) + t1.start() + + # Confirm a filename button + Button(self.child, text='Confirm!', command=get_filename).grid(row=1, column=1, sticky=W, pady=5) + +root = Tk() +editor = Editor(root) +root.mainloop() + + diff --git a/server_CE.v9.0.py b/server_CE.v9.0.py new file mode 100644 index 0000000..efdbdd1 --- /dev/null +++ b/server_CE.v9.0.py @@ -0,0 +1,228 @@ +from socket import AF_INET, SOCK_STREAM, socket +import os +import threading +import logging + +logging.basicConfig(level=logging.DEBUG, + format='(%(threadName)-9s) %(message)s',) + +directory = os.getcwd() + '/files/' # directory of a project folder "files" +print directory +if os.path.isdir(directory) == False: + os.mkdir('files') +recv_buffer_length = 1024 +list_of_clients = [] +file_lock = {} + +class File: + def __init__(self, name, directory): + self.name = name + self.directory = directory + self.lock = threading.Lock() + if os.path.isfile(directory + name) == False: + print "File isn`t exist" + f = open(directory + name, 'w') + f.close() + + def read(self): + f = None + try: + f = open(self.directory + self.name, 'r') + message = f.read() + return message + except Exception as e: + print e + finally: + if f is file: + f.close() + + def edit(self, message, client_socket): + print "Editting" + print "Current edition:", message + if message == 'Finished': + return + f = None + print file_lock + while file_lock[self.name] == True: + continue + file_lock[self.name] = True + try: + message = message.split(' ') + if message[0] == '1': # insert + element = message[1] + line = int(message[2]) - 1 + position = int(message[3]) + self.lock.acquire() + logging.debug('Acquired a lock for inserting') + f = open(self.directory + self.name, 'r') + lines = f.readlines() + f.close() + while line >= len(lines): + lines.append('\n') + lines[line] = lines[line][:position] + element + lines[line][position:] + f = open(self.directory + self.name, 'w') + for l in lines: + f.write(l) + + elif message[0] == '0': # delete + line = int(message[1]) - 1 + position = int(message[2]) + self.lock.acquire() + logging.debug('Acquired a lock for deleting') + f = open(self.directory + self.name, 'r') + lines = f.readlines() + f.close() + if line < len(lines): + lines[line] = lines[line][:position] + lines[line][position+1:] + f = open(self.directory + self.name, 'w') + for l in lines: + f.write(l) + + elif message[0] == '3': + element = ' ' + line = int(message[1]) - 1 + position = int(message[2]) + self.lock.acquire() + logging.debug('Acquired a lock for inserting') + f = open(self.directory + self.name, 'r') + lines = f.readlines() + f.close() + while line >= len(lines): + lines.append('\n') + lines[line] = lines[line][:position] + element + lines[line][position:] + f = open(self.directory + self.name, 'w') + for l in lines: + f.write(l) + + elif message[0] == '4': + element = '\n' + line = int(message[1]) - 1 + position = int(message[2]) + self.lock.acquire() + logging.debug('Acquired a lock for inserting') + f = open(self.directory + self.name, 'r') + lines = f.readlines() + f.close() + while line >= len(lines): + lines.append('\n') + lines[line] = lines[line][:position] + element + lines[line][position:] + f = open(self.directory + self.name, 'w') + for l in lines: + f.write(l) + + except Exception as e: + print "Edition exception:", e + finally: + logging.debug('Released a lock for editting') + if f is file: + f.close() + self.lock.release() + file_lock[self.name] = False + sendEdition(self.name, message, client_socket) + + +def sendListOfFiles(client_socket): + files = os.listdir(directory) + sep = ';;;' + list = sep.join(files) + if not list: + list = 'empty' + client_socket.sendall(list) + + +def editFile(file, client_socket): + edition = client_socket.recv(recv_buffer_length) + print "Edition after creating:", edition + while 1: + if edition == 'Finished': + client_socket.send('Finished') + break + file.edit(edition, client_socket) + edition = client_socket.recv(recv_buffer_length) + + +def sendEdition(file_name, edition, current_socket): + try: + print "Send edition" + edition = ' '.join(edition) + print "List of clients:", list_of_clients + print "Current client:", current_socket + for socket in list_of_clients: + if socket != current_socket: + socket.sendall(file_name + ' ' + edition) + print "Edition sent", edition + except Exception as e: + print "Send edition exception:", e + + +def workWithClient(client_socket): + action = client_socket.recv(recv_buffer_length) + while action != 'Terminated': + if action == 'Create new file': + createNewFile(client_socket) + elif action == 'Open/Edit file': + openExistingFile(client_socket) + elif action == 'Finished': + print 'Finished command received' + client_socket.send('Finished') + action = client_socket.recv(recv_buffer_length) + print action, 'action' + client_socket.close() + list_of_clients.remove(client_socket) + + +def createNewFile(client_socket): + print 'Create new file' + file_name = client_socket.recv(recv_buffer_length) + if file_name == 'Finished': + return + print 'File name received', file_name + if os.path.isfile(directory + file_name) == True: # while file with such name is already exist + print 'File with such name is exist' # acknowledgement that file with such name is exist + client_socket.sendall('1') + else: + print 'File with such name isn`t exist' + client_socket.sendall('0') # acknowledgement that file with such name isn`t exist + file_lock[file_name] = False + file = File(file_name, directory) + editFile(file, client_socket) + + +def openExistingFile(client_socket): + print "Open existing file" + sendListOfFiles(client_socket) + print 'List of files sent' + file_name = client_socket.recv(recv_buffer_length) + if file_name == 'Finished': + return + print 'File name recieved', file_name + if file_name not in file_lock: + file_lock[file_name] = False + file = File(file_name, directory) + message = file.read() + message += '\n' # acknowledgement of ending of the file + client_socket.sendall(message) + print 'File sent' + editFile(file, client_socket) + + +if __name__ == '__main__': + s = socket(AF_INET, SOCK_STREAM) + s.bind(('127.0.0.1',5595)) + backlog = 5 + s.listen(backlog) + count = 1 + threads = [] + while True: + try: + client_socket, client_addr = s.accept() + list_of_clients.append(client_socket) + print "Client " + str(count) + " connected" + t = threading.Thread(name='Thread ' + str(count), target = workWithClient, args = (client_socket, )) + print 'Thread ' + str(count) + ' created' + threads.append(t) + t.start() + print 'Thread ' + str(count) + ' started' + finally: + count += 1 +