服务器远程辅助下载文件

最近在做深度学习发现下载模型时速度太慢,可能是外网的原因。所以做了一个小插件,利用远程服务器辅助下载文件。

你需要准备:
远程服务器(具备TCP接口)、本地电脑(python环境)
所需知识:
1、PYQT基础知识
2、TCP知识
3、QT多线程知识

PYQT做界面 & 多线程

如果你对PYQT不太了解,参考可以五分钟掌握。

如图所示,我们搭建了我们的UI界面,主要三个部分:端口号,下载链接,日志。
在这里插入图片描述
代码可以参考:

class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.ok = False
        self.port_default = 0
        self.content_tmp = ''
        self.initUI()
    #UI界面涉及
    def initUI(self):
        #1 说明内容
        self.lbl2 = QLabel(self)
        self.lbl2.setText(
            "1、You should input Port first.\n2、Enter the URL and click the download button\n3、If you have some problem, send email to\n [email protected]")
        self.lbl2.move(30, 10)
        #2 下载区
        #2.1 文本URL
        self.lbl = QLabel(self)
        self.lbl.setText("Url:")
        self.lbl.move(30, 93)
        #2.2 链接URL
        self.file_url = QLineEdit(self)
        self.file_url.move(50, 90)
        self.file_url.setGeometry(50, 90, 250, 23)
        #2.3 下载按钮
        download_button = QPushButton('Download', self)
        download_button.clicked.connect(self.download)
        download_button.move(320, 90)
        #3 端口号按钮
        self.download_button = QPushButton('No Port', self)
        self.download_button.clicked.connect(self.login)
        self.download_button.move(400, 10)
        #4 日志
        self.tmp = QTextEdit(self)
        self.tmp.move(50, 120)
        self.tmp.setGeometry(50, 120, 350, 70)

        #5 标题
        self.setGeometry(300, 300, 500, 200)
        self.setWindowTitle('服务器加速下载器@cloudcver')
        self.show()
    def login(self):
        text, ok = QInputDialog.getText(self, 'Set Port',
                                        'Enter your port:')
        if ok:
            self.port_default = int(text)
            self.download_button.setText(text)
            self.content_tmp = self.content_tmp + "%s:Set port at %s\n"%(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),text)
            self.tmp.setText(self.content_tmp)
            self.ok = True
    def download(self):
        if self.ok:
            self.content_tmp = self.content_tmp + "%s:Send the task to server\n" % (
                time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
            self.tmp.setText(self.content_tmp)
            self.thread = DownloadThread()
            self.thread.set_port_url(self.port_default,self.file_url.text())  # 创建
            self.thread.trigger.connect(self.finish)  # 连接信号
            self.thread.start()  # 开始线程
        else:
            reply = QMessageBox.question(self, 'Message',
                                         "You should set port first", QMessageBox.Yes)
    def finish(self):
        self.content_tmp = self.content_tmp + "%s:Finish!\n" % (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
        self.tmp.setText(self.content_tmp)

界面很简单就不说了,主要说一下多线程内容!
重点看一下这里!
重点看一下这里!
重点看一下这里!

1、看download函数,ok这个参数代表已经设定好端口号。初始ok是False,在Port按钮输入后就变为True了。
2、这里我们启动了一个多线程DownloadThread(),其定义了一个线程类,这个类下面有几个方法:
2.1 set_port_url()是我们自己定义的方法,为了设定一些参数。
2.2 run是一个父类的函数,我们需要重构一下,这就是当执行线程时需要执行的函数。也就是self.thread.start() 后就开始执行run这个函数。
2.3 trigger是我们创建的一个pyqt信号,我们可以让它连接一个函数,然后在run执行完后传递退出的信号,代表推出后执行它连接的函数。
具体的代码可以看:

class DownloadThread(QThread):
    trigger = pyqtSignal()

    def __int__(self):
        super(DownloadThread, self).__init__()
    def set_port_url(self,port_default,url):
        self.port_default = port_default
        self.url = url
    def run(self):
		##一会补充!
        # # 循环完毕后发出信号
        # print('1线程运行完了')
        self.trigger.emit()

TCP服务

发布了139 篇原创文章 · 获赞 26 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/CLOUD_J/article/details/104752716