Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
186 changes: 186 additions & 0 deletions server_CE.v4.0.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,186 @@
from socket import AF_INET, SOCK_STREAM, socket
import os
import threading
import logging
from time import sleep

logging.basicConfig(level=logging.DEBUG,
format='(%(threadName)-9s) %(message)s',)

directory = os.getcwd() + '\\files\\' # directory of a project folder "files"
recv_buffer_length = 1024
list_of_clients = []

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
f = None
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)
except Exception as e:
print e
finally:
logging.debug('Released a lock for editting')
if f is file:
f.close()
sendEdition(self.name, message, client_socket)
self.lock.release()


def sendListOfFiles(client_socket):
files = os.listdir(directory)
sep = ';;;'
list = sep.join(files)
client_socket.sendall(list)


def editFile(file, client_socket):
edition = client_socket.recv(recv_buffer_length)
print "Edition after creating:", edition
while edition != 'Finished':
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"
except Exception as e:
print e


def workWithClient(client_socket):
action = client_socket.recv(recv_buffer_length)
while action != 'Terminate':
print "Action:", action
if action == 'Create new file':
createNewFile(client_socket)
elif action == 'Open/Edit file':
openExistingFile(client_socket)
action = client_socket.recv(recv_buffer_length)
client_socket.close()
del list_of_clients[client_socket]


def createNewFile(client_socket):
print 'Create new file'
file_name = client_socket.recv(recv_buffer_length)
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 = 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)
print 'File name recieved', file_name
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',7777))
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