class DIR_WINDOW(QtWidgets.QMainWindow): def __init__(self): super().__init__() self.title = "Convex" self.top = 100 self.left = 100 self.width = 800 self.height = 400 self.icon_name = "NIT-Silchar-Logo.png" self.path = '' self.initApp() def initApp(self): self.setWindowIcon(QtGui.QIcon(self.icon_name)) self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.model = QFileSystemModel() self.model.setRootPath("C:") self.tree = QTreeView() self.tree.setModel(self.model) self.tree.setAnimated(False) self.tree.setIndentation(20) self.tree.setSortingEnabled(True) self.tree.setWindowTitle("Explorer") self.tree.resize(640, 480) self.tree.move(20, 20) self.tree.clicked.connect(self.selectPath) self.select_button = QPushButton("Select", self) self.select_button.setToolTip("Click to select image") self.select_button.setMinimumHeight(40) self.select_button.clicked.connect(self.obtainPath) #windowLayout = QVBoxLayout() #windowLayout.addWidget(self.tree) #windowLayout.addWidget(select_button) #self.setLayout(windowLayout) self.show() def selectPath(self, index): self.path = self.sender().model().filePath(index) def obtainPath(self): print("obtain path:" + self.path)
class Mapp(QMainWindow): def __init__(self): super(Mapp, self).__init__() self.dir = QDirModel(self) self.tree = QTreeView(self) self.tree.setModel(self.dir) w, h = 800, 600 r = 30 self.tree.setFixedSize(w - r, h - r) self.tree.move(10, 10) self.setFixedSize(w, h) self.tree.clicked.connect(self.montre) def montre(self): pass
class ftp_client_GUI(QtWidgets.QWidget): def __init__(self): super(ftp_client_GUI, self).__init__() self.initGUI() def initGUI(self): qr = self.frameGeometry() cp = QtWidgets.QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) self.setWindowTitle("FTP Client") #label self.title_label = QtWidgets.QLabel(self) self.title_label.resize(300, 40) self.title_label.move(300, 20) self.title_label.setText("FTP Client End") self.title_label.setStyleSheet("border-color: rgb(170, 150, 163);" "font: 75 20pt;" "color: rgb(126, 120, 46);") # ip_edit self.ip_edit = QLineEdit(self) self.ip_edit.resize(230, 40) self.ip_edit.move(100, 80) self.ip_edit.setPlaceholderText("ip like 127.0.0.1") #port_edit self.port_edit = QLineEdit(self) self.port_edit.resize(130, 40) self.port_edit.move(370, 80) self.port_edit.setPlaceholderText("port like 3000") # connect_btn self.connect_btn = QtWidgets.QPushButton('connect', self) self.connect_btn.resize(150, 40) self.connect_btn.move(550, 80) self.connect_btn.clicked.connect(self.on_connect_btn) # cmd edit self.sentence_editor = QLineEdit(self) self.sentence_editor.resize(400, 40) self.sentence_editor.move(100, 130) self.sentence_editor.setPlaceholderText( "input command and argument, like 'USER anonymous'") # cmd btn self.cmd_btn = QtWidgets.QPushButton('push command', self) self.cmd_btn.resize(150, 40) self.cmd_btn.move(550, 130) self.cmd_btn.clicked.connect(self.on_cmd_btn) # text browser self.text_browser = QTextBrowser(self) self.text_browser.resize(450, 160) self.text_browser.move(730, 20) # file tree self.file_model = QFileSystemModel(self) dir_path = os.path.dirname(os.path.abspath(__file__)) self.file_model.setRootPath(dir_path) self.tree = QTreeView(self) self.tree.setModel(self.file_model) self.tree.setRootIndex(self.file_model.index(dir_path)) self.tree.setAnimated(True) self.tree.setIndentation(20) self.tree.setSortingEnabled(True) self.tree.setWindowTitle("Dir View") self.tree.resize(500, 370) self.tree.move(830, 200) # timer self.timer = QBasicTimer() self.timer.start(1000, self) # internet speed display self.width = 200 self.height = 20 self.bias = 1200 self.cur_load_volume = 0 self.pre_load_volume = 0 self.internet_speed_label = QLabel(self) self.internet_speed_label.move(110, 600) self.internet_speed_label.resize(300, 20) self.internet_speed_label.setStyleSheet( "border-color: rgb(170, 150, 163);" "font: 30 12pt;" "color: rgb(126, 120, 46);") # file total load self.file_total_upload = 0 self.file_total_download = 0 self.file_total_upload_num = 0 self.file_total_download_num = 0 self.file_total_upload_label = QLabel(self) self.file_total_upload_num_label = QLabel(self) self.file_total_download_label = QLabel(self) self.file_total_download_num_label = QLabel(self) self.file_total_upload_label.move(self.bias, self.height + 40) self.file_total_upload_num_label.move(self.bias, self.height + 60) self.file_total_download_label.move(self.bias, self.height + 80) self.file_total_download_num_label.move(self.bias, self.height + 100) self.file_total_upload_label.resize(self.width, self.height) self.file_total_upload_num_label.resize(self.width, self.height) self.file_total_download_label.resize(self.width, self.height) self.file_total_download_num_label.resize(self.width, self.height) self.file_total_upload_label.setStyleSheet( "border-color: rgb(170, 150, 163);" "font: 30 12pt;" "color: rgb(126, 120, 46);") self.file_total_upload_num_label.setStyleSheet( "border-color: rgb(170, 150, 163);" "font: 30 12pt;" "color: rgb(126, 120, 46);") self.file_total_download_label.setStyleSheet( "border-color: rgb(170, 150, 163);" "font: 30 12pt;" "color: rgb(126, 120, 46);") self.file_total_download_num_label.setStyleSheet( "border-color: rgb(170, 150, 163);" "font: 30 12pt;" "color: rgb(126, 120, 46);") # tabel widget self.TableWidget = QTableWidget(self) self.TableWidget.resize(710, 370) self.TableWidget.move(100, 200) self.TableWidget.setRowCount(0) self.TableWidget.setColumnCount(3) self.TableWidget.setHorizontalHeaderLabels(['name', 'info', 'code']) self.TableWidget.setColumnWidth(0, 80) self.TableWidget.setColumnWidth(1, 560) self.TableWidget.setColumnWidth(2, 65) # progress bar self.step = 0 self.retr_file_size = 0 self.pbar = QProgressBar(self) self.pbar.resize(700, 15) self.pbar.move(110, 580) self.pbar.setValue(self.step) self.resize(1400, 650) self.show() self.client_command_socket = 1 self.client_file_socket = 1 self.server_file_socket = 1 self.file_port = 3000 self.file_addr = "127.0.0.1" self.server_port = 3000 self.server_addr = "127.0.0.1" self.reply_sentence = "" self.req_sentence = "" self.client_command = "" self.client_argument = "" self.client_state = 0 self.offset_read = 0 self.transfer_file_path = "" self.common_command = { "USER", "PASS", "TYPE", "MKD", "RNFR", "RMD", "RNTO", "PWD", "CWD", "SYST", "REST" } self.parti_command = {"QUIT", "PORT", "PASV", "RETR", "LIST", "STOR"} def timerEvent(self, *args, **kwargs): volume = self.cur_load_volume - self.pre_load_volume byte_volume = volume % 1024 kbyte_volume = volume / 1024 self.internet_speed_label.setText("load file rate : " + str(kbyte_volume) + " kb/s") self.pre_load_volume = self.cur_load_volume self.file_total_upload_label.setText( "upload : " + str(int(self.file_total_upload / 1024)) + " kb") self.file_total_upload_num_label.setText( "upload : " + str(int(self.file_total_upload_num)) + " files") self.file_total_download_label.setText( "download : " + str(int(self.file_total_download / 1024)) + " kb") self.file_total_download_num_label.setText( "download : " + str(self.file_total_download_num) + " files") if self.step == 100: self.step = 0 self.pbar.setValue(0) return # send client connect msg def on_connect_btn(self): port = self.port_edit.text() ip = self.ip_edit.text() try: self.client_command_socket = socket(AF_INET, SOCK_STREAM) self.client_command_socket.connect((ip, int(port))) self.reply_sentence = str( self.client_command_socket.recv(4096).decode()) self.add_item("server " + str(self.reply_sentence)) self.client_state = 1 except: self.client_state = 1 sent = "system 0 already connect!" self.add_item(sent) # receive client input and push def on_cmd_btn(self): sentence = self.sentence_editor.text() cmd_arg = sentence.split(' ') cmd_arg[0] = cmd_arg[0].upper() # according to rfc959 temp = "" if self.client_state == 0: sent = "system 0 not connect!" self.add_item(sent) elif self.client_state == 1 or self.client_state == 2 or self.client_state == 3: if cmd_arg[0] in self.common_command: if cmd_arg[0] == "REST": sentence = sentence + " " + str(self.offset_read) sentence = sentence + "\r\n" self.client_command_socket.send(sentence.encode()) senten = self.client_command_socket.recv(4096) self.reply_sentence = senten.decode() self.add_item("server " + self.reply_sentence) elif cmd_arg[0] in self.parti_command: if cmd_arg[0] == "QUIT": sentence = sentence + "\r\n" self.client_command_socket.send(sentence.encode()) self.reply_sentence = str( self.client_command_socket.recv(4096).decode()) self.add_item("server " + str(self.reply_sentence)) self.client_command_socket.close() return elif cmd_arg[0] == "PORT": port_addr = cmd_arg[1].split(',') if len(port_addr) < 6: self.text_browser.append( "system : invalid PORT addr!\r\n") self.text_browser.moveCursor( self.text_browser.textCursor().End) return else: addr = port_addr[0] + '.' + port_addr[ 1] + '.' + port_addr[2] + '.' + port_addr[3] port = int(port_addr[4]) * 256 + int(port_addr[5]) self.client_file_socket = socket(AF_INET, SOCK_STREAM) self.client_file_socket.bind((addr, port)) self.client_file_socket.listen(10) sentence = sentence + "\r\n" self.client_command_socket.send(sentence.encode()) self.reply_sentence = str( self.client_command_socket.recv(4096).decode()) self.add_item("server " + str(self.reply_sentence)) self.client_state = 2 elif cmd_arg[0] == "PASV": sentence = sentence + "\r\n" self.client_command_socket.send(sentence.encode()) self.reply_sentence = str( self.client_command_socket.recv(4096).decode()) self.add_item("server " + self.reply_sentence) li = 1 li = re.search(r"\(.*\)", self.reply_sentence) addr = li.group()[1:-1] addr = addr.split(',') port = int(addr[-2]) * 256 + int(addr[-1]) addr = addr[0] + '.' + addr[1] + '.' + addr[ 2] + '.' + addr[3] self.file_addr = addr[0:] self.file_port = port self.client_state = 3 self.client_file_socket = socket(AF_INET, SOCK_STREAM) elif cmd_arg[0] == "RETR": if self.client_state == 2: sentence = sentence + "\r\n" self.client_command_socket.send(sentence.encode()) self.server_file_socket, temp = self.client_file_socket.accept( ) self.reply_sentence = str( self.client_command_socket.recv(4096).decode()) self.add_item("server " + str(self.reply_sentence)) if self.reply_sentence.split( ' ')[0] != "550" and self.reply_sentence.split( ' ')[0] != "503": self.retr_file_size = self.get_retr_file_size( self.reply_sentence) self.transfer_file_path = cmd_arg[1][:] self.recv_data() self.server_file_socket.close() self.client_file_socket.close() self.server_file_socket = -1 self.client_file_socket = -1 elif self.client_state == 3: sentence = sentence + "\r\n" self.client_command_socket.send(sentence.encode()) self.client_file_socket.connect( (self.file_addr, self.file_port)) self.reply_sentence = str( self.client_command_socket.recv(4096).decode()) self.add_item("server " + str(self.reply_sentence)) self.server_file_socket = self.client_file_socket if self.reply_sentence.split( ' ')[0] != "550" and self.reply_sentence.split( ' ')[0] != "503": self.retr_file_size = self.get_retr_file_size( self.reply_sentence) self.transfer_file_path = cmd_arg[1][:] self.recv_data() self.server_file_socket.close() else: self.add_item("system 0 require PASV/PORT mode") if self.reply_sentence.split(' ')[0] != "550" and len( self.reply_sentence.split("\r\n")[1] ) == 0 and self.step == 100 and self.reply_sentence.split( ' ')[0] != "503" and self.client_state != 1: self.reply_sentence = str( self.client_command_socket.recv(4096).decode()) self.add_item("server " + str(self.reply_sentence)) self.client_state = 1 elif cmd_arg[0] == "LIST": if self.client_state == 2: sentence = sentence + "\r\n" self.client_command_socket.send(sentence.encode()) self.server_file_socket, temp = self.client_file_socket.accept( ) self.reply_sentence = str( self.client_command_socket.recv(4096).decode()) self.add_item("server " + str(self.reply_sentence)) if self.reply_sentence.startswith("150"): self.print_list(self.server_file_socket) self.server_file_socket.close() self.client_file_socket.close() self.server_file_socket = -1 self.client_file_socket = -1 elif self.client_state == 3: sentence = sentence + "\r\n" self.client_command_socket.send(sentence.encode()) self.client_file_socket.connect( (self.file_addr, self.file_port)) self.reply_sentence = str( self.client_command_socket.recv(4096).decode()) self.add_item("server " + str(self.reply_sentence)) if self.reply_sentence.startswith("150"): self.server_file_socket = self.client_file_socket self.print_list(self.server_file_socket) self.server_file_socket.close() else: self.add_item("system 0 require PASV/PORT mode") if self.reply_sentence.startswith( "150") and self.client_state != 1: self.reply_sentence = str( self.client_command_socket.recv(4096).decode()) self.add_item("server " + str(self.reply_sentence)) self.client_state = 1 elif cmd_arg[0] == "STOR": if self.get_file_size(cmd_arg[1]) == 0: self.add_item("system 0 file not found") return if self.client_state == 2: sentence = sentence + "\r\n" self.client_command_socket.send(sentence.encode()) self.server_file_socket, temp = self.client_file_socket.accept( ) self.reply_sentence = str( self.client_command_socket.recv(4096).decode()) self.add_item("server " + str(self.reply_sentence)) self.send_data(cmd_arg[1], self.server_file_socket) self.server_file_socket.close() self.client_file_socket.close() self.server_file_socket = -1 self.client_file_socket = -1 elif self.client_state == 3: sentence = sentence + "\r\n" self.client_command_socket.send(sentence.encode()) self.client_file_socket.connect( (self.file_addr, self.file_port)) self.reply_sentence = str( self.client_command_socket.recv(4096).decode()) self.add_item("server " + str(self.reply_sentence)) self.server_file_socket = self.client_file_socket self.send_data(cmd_arg[1], self.server_file_socket) self.server_file_socket.close() else: self.add_item("system 0 require PASV/PORT mode") if self.client_state != 1: self.reply_sentence = str( self.client_command_socket.recv(4096).decode()) self.add_item("server " + str(self.reply_sentence)) self.client_state = 1 else: self.text_browser.append("system : invalid command") self.text_browser.moveCursor( self.text_browser.textCursor().End) else: sent = "system 0 not connect!" self.add_item(sent) def recv_data(self): file_path = self.transfer_file_path[:] sock = self.server_file_socket if self.offset_read == 0: fp = open(file_path, "wb") else: fp = open(file_path, "ab") fp.seek(self.offset_read - 1, 0) self.retr_file_size = self.retr_file_size - self.offset_read data_stream = sock.recv(4096) self.pre_load_volume = 0 self.cur_load_volume = 0 count = 0 time1 = int(time.time() * 10000) time2 = int(time.time() * 10000) while data_stream: self.cur_load_volume += len(data_stream) self.step = (self.cur_load_volume / self.retr_file_size) * 100 self.pbar.setValue(self.step) fp.write(data_stream) data_stream = '' data_stream = sock.recv(4096) count += 1 if count == 20: volume = self.cur_load_volume - self.pre_load_volume byte_volume = volume % 1024 kbyte_volume = volume / 1024 time2 = int(time.time() * 10000) interval = (time2 - time1) / 10000 if interval != 0: self.internet_speed_label.setText( "load file rate : " + str(round(kbyte_volume / interval, 1)) + " kb/s") self.pre_load_volume = self.cur_load_volume time1 = time2 count = 0 else: continue if self.step == 100: self.offset_read = 0 else: self.offset_read = self.cur_load_volume fp.close() self.file_total_download += self.cur_load_volume self.file_total_download_num += 1 self.pre_load_volume = 0 self.cur_load_volume = 0 return def send_data(self, file_path, sock): fp = open(file_path, "rb") n = 2 buf = "" file_size = int(self.get_file_size(file_path)) self.pre_load_volume = 0 self.cur_load_volume = 0 count = 0 time1 = int(time.time() * 10000) time2 = int(time.time() * 10000) while n > 0: buf = fp.read(4096) n = len(buf) self.cur_load_volume += n self.step = (self.cur_load_volume / file_size) * 100 self.pbar.setValue(self.step) count += 1 if count == 20: volume = self.cur_load_volume - self.pre_load_volume byte_volume = volume % 1024 kbyte_volume = volume / 1024 time2 = int(time.time() * 10000) interval = (time2 - time1) / 10000 if interval != 0: self.internet_speed_label.setText( "load file rate : " + str(round(kbyte_volume / interval, 1)) + " kb/s") self.pre_load_volume = self.cur_load_volume time1 = time2 count = 0 sock.send(buf) fp.close() self.file_total_upload += self.cur_load_volume self.file_total_upload_num += 1 self.pre_load_volume = 0 self.cur_load_volume = 0 return def print_list(self, sock): n = 2 data_stream = sock.recv(4096) while n > 0: self.text_browser.setText(data_stream.decode()) self.text_browser.moveCursor(self.text_browser.textCursor().End) data_stream = sock.recv(4096) n = len(data_stream) return def recv_info(self): self.reply_sentence = self.client_command_socket.recv(4096).decode() self.text_browser.append("server : " + self.reply_sentence) self.text_browser.moveCursor(self.text_browser.textCursor().End) return def add_item(self, sentence): spl = sentence.split(' ') name = spl[0] code = spl[1] info = "" for i in spl[2:]: info += i + ' ' self.TableWidget.setRowCount(self.TableWidget.rowCount() + 1) newItem = QTableWidgetItem(name) self.TableWidget.setItem(self.TableWidget.rowCount() - 1, 0, newItem) newItem = QTableWidgetItem(info) self.TableWidget.setItem(self.TableWidget.rowCount() - 1, 1, newItem) newItem = QTableWidgetItem(code) self.TableWidget.setItem(self.TableWidget.rowCount() - 1, 2, newItem) def get_file_size(self, file_path): try: size = os.path.getsize(file_path) return size except Exception as err: return 0 def get_retr_file_size(self, sentence): li = re.search(r"\(.*\)", self.reply_sentence) if li.group() != None: temp = li.group()[1:-1] cv = re.search(r"\d+", temp) return int(cv.group()) else: return 99999999