python 作业 socket 执行命令+FTP上传

1. 执行命令

服务端:

#!/usr/bin/env python
# --*-- encoding:utf-8 --*--

import socketserver
import subprocess
# sscok = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# sscok.bind(('127.0.0.1',9999,))
# sscok.listen(5)
# while True:
#     conn,addr = sscok.accept()
#     conn.sendall(bytes('欢迎使用远程命令',encoding='utf-8'))
#     conn.close()
# sscok.close()


class myserver(socketserver.BaseRequestHandler):
    def handle(self):
        conn = self.request
        addr = self.client_address
        conn.sendall(bytes('欢迎使用远程命令',encoding='utf-8'))
        while True:
            print('等待接受CMD')
            try:
                data_byte = conn.recv(1024)
            except Exception as e:
                break
            data_str = str(data_byte,encoding='utf-8')
            try:
                res = subprocess.check_output(data_str,shell=True)
            except Exception as e:
                conn.sendall(bytes('error cmd',encoding='utf-8'))
                continue
            else:
                conn.sendall(bytes(str(len(res)),encoding='utf-8'))
            print(str(conn.recv(1024),encoding='utf-8')) #粘包问题
            conn.sendall(res)

        conn.close()

if __name__ == '__main__':
    server = socketserver.ThreadingTCPServer(('127.0.0.1',9999,),myserver)
    server.serve_forever()

客户端

#!/usr/bin/env python
# --*-- encoding:utf-8 --*--

import socket
csock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
csock.connect(('127.0.0.1',9999,))
data =csock.recv(1024)
print(str(data,encoding='utf-8'))
while True:
    ml = input("请输入要执行的CMD命令:")
    csock.sendall(bytes(ml,encoding='utf-8'))
    data_byte = csock.recv(1024)
    data_str = str(data_byte,encoding='utf-8')
    if data_str=='error cmd':
        print('错误的命令')
    else:
        csock.sendall(bytes('ack',encoding='utf-8'))
        recv_size = 0
        recv_data =bytes()
        while recv_size< int(data_str):
            data = csock.recv(1024)
            recv_data +=data
            recv_size +=len(data)
        print(str(recv_data, encoding='gbk'))
csock.close()

 2.FTP上传 +断点上传

服务端

#!/usr/bin/env python
# --*-- encoding:utf-8 --*--
import socketserver
import os
class myserver(socketserver.BaseRequestHandler):
    def handle(self):
        print('wait for connect.......')
        conn = self.request
        addr = self.client_address
        conn.sendall(bytes('欢迎使用FTP',encoding='utf-8'))
        while True:
            try:
                file_recv_byte =conn.recv(1024)
            except Exception as e:
                break
            file_recv_str =str(file_recv_byte,encoding='utf-8')
            base_dir = os.path.dirname(__file__)
            load_path = os.path.join(base_dir,file_recv_str)
            if not os.path.exists(os.path.dirname(load_path)):
                os.mkdir(os.path.dirname(load_path))
            if os.path.exists(load_path):
                conn.sendall(bytes('exists',encoding='utf-8'))
                pos_file_size = os.stat(load_path).st_size
                file_size = int(str(conn.recv(1024),encoding='utf-8'))
                if file_size == pos_file_size:
                    conn.sendall(bytes('已存在',encoding='utf-8'))
                else:
                    conn.sendall(bytes('可以续传', encoding='utf-8'))
                    if str(conn.recv(1024),encoding='utf-8')=='续传':
                        conn.sendall(bytes(str(pos_file_size),encoding='utf-8'))
                        with open(load_path, 'ab') as f:
                            recv_size = pos_file_size
                            while recv_size < file_size:
                                try:
                                    data = conn.recv(1024)
                                except Exception as e:
                                    break
                                f.write(data)
                                recv_size += len(data)


            else:
                conn.sendall(bytes('not exists', encoding='utf-8'))
                with open(load_path,'wb') as f:
                    data = conn.recv(1024)
                    recv_size = 0
                    file_size = int(str(data,encoding='utf-8'))
                    conn.sendall(bytes('ack',encoding='utf-8'))
                    while recv_size< file_size:
                        try:
                            data = conn.recv(1024)
                        except Exception as e:
                            break
                        f.write(data)
                        recv_size += len(data)

        conn.close()


if __name__ == '__main__':
    server = socketserver.ThreadingTCPServer(('127.0.0.1',9999),myserver)
    server.serve_forever()

客户端

#!/usr/bin/env python
# --*-- encoding:utf-8 --*--
import socket
import os
import sys
import time
def show_bar(now_size,total_size):
    sys.stdout.write('\r')
    tem_f = now_size/total_size
    tem_d = round(tem_f*100)
    sys.stdout.write('%s | %0.2f%% '%('>'*tem_d,tem_f*100))
    sys.stdout.flush()
    time.sleep(0.0001)


csock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
csock.connect(('127.0.0.1',9999))
data = csock.recv(1024)
print(str(data,encoding='utf-8'))
while True:
    file = input('请输入要上传的文件:')
    file_path = input('请输入要存储路径:')
    file_send =os.path.join(file_path,file)
    csock.sendall(bytes(file_send,encoding='utf-8'))
    file_size = os.stat(file).st_size
    if str(csock.recv(1024),encoding='utf-8')=='exists':
        csock.sendall(bytes(str(file_size), encoding='utf-8'))
        flag = csock.recv(1024)
        if str(flag,encoding='utf-8')=='已存在':
            print('文件已经存在')
            csock.sendall(bytes('结束',encoding='utf-8'))
        else:
            csock.sendall(bytes('续传',encoding='utf-8'))
            pos_file_size=int(str(csock.recv(1024),encoding='utf-8'))
            print(pos_file_size)
            with open(file,'rb') as f:
                has_send_size = pos_file_size
                f.seek(pos_file_size)
                for line in f:
                    csock.sendall(line)
                    has_send_size += len(line)
                    show_bar(has_send_size, file_size)
                print('上传成功')
    else:
        csock.sendall(bytes(str(file_size),encoding='utf-8'))
        csock.recv(1024)#收到确认消息
        with open(file,'rb') as f:
            has_send_size = 0
            for line in f:
                csock.sendall(line)
                has_send_size +=len(line)
                show_bar(has_send_size,file_size)
            print('上传成功')

csock.close()

 

posted @ 2017-05-05 23:26  1916  阅读(189)  评论(0)    收藏  举报