1 2 3 4

基于select的非阻塞ftp传输(未优化)

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: Colin Yao
import socket
import select
import os,json,time,queue
import threading
class select_server():
    def __init__(self,cmd,r):
        self.cmd =cmd
        self.r = r

    def run(self):
        cmd_str = self.cmd
        cmd_str = cmd_str.split()[0]
        if hasattr(self,cmd_str):
            getattr(self,cmd_str)()

    def get(self):
        filename = self.cmd.split()[1]
        Path = os.path.dirname(os.path.abspath(__file__))
        file_path = Path + '\\' + filename +'.new'
        if os.path.exists(Path) and os.path.isfile(file_path):
            os.remove(file_path)
            self.r.send(b'same')
            print("有重复文件")

        else:
            self.r.send(b'dont same')
            filesize = os.stat(filename).st_size
            msg_dic = {"filesize": filesize}
            self.r.send(json.dumps(msg_dic).encode())
            file = open("%s" % filename, "rb")
            for line in file:
                self.r.send(line)
            else:
                print("get%s" % file)
                file.close()
                print("处理完成")

    def put(self):
        filename = self.cmd.split()[1]
        Path = os.path.dirname(os.path.abspath(__file__))
        file_path = Path + '\\' + filename +'.new'
        if os.path.exists(Path) and os.path.isfile(file_path):
            os.remove(file_path)
            self.r.send(b'same')
            print("有相同文件")

        else:
            self.r.send(b'dont same')
            file_size = 0
            msg_dic = json.loads(self.r.recv(1024).decode())
            receive_size = msg_dic["filesize"]
            print(receive_size)
            file = open("%s.new" % filename, "wb")
            while receive_size > file_size:
                data =self.r.recv(1024)
                file.write(data)
                file_size +=len(data)
            else:
                print("put success")
                file.close()



def ftp_server():#主程序
    server =socket.socket()
    server.bind(('localhost',9999))
    server.listen(1024)
    inputs = [server]
    outputs = []
    ms_dic = {}
    while True:
        readable,writeable,exceptional = select.select(inputs,outputs,inputs)
        for r in readable:
            if r is server:
                conn,addr = r.accept()
                print("连上客户端",addr)
                inputs.append(conn)
                ms_dic[conn] = queue.Queue()
            else:
                try:
                    # while True:#如果存在循环会导致一直是上一个client占用recv这个通道,因为设定的r是同一个
                    cmd =r.recv(1024).decode()
                    if cmd:
                        func= select_server(cmd,r)
                        func_num = func.run()
                except ConnectionResetError as e :
                    inputs.remove(r)
                    print("关闭%s"%r)

客户端
#!/usr/bin/env python
# -*- coding = utf-8 -*-
# Autor :xuexuexue
import socket,os
import json
client=socket.socket()#声明socket类型同时生成socket链接对象
client.connect(('localhost',9999))
while True:
file = input(">>:")
client.send(file.encode())
if len(file) == 0:
print("请重新输入:")
continue
cmd = file.split()[0]
if cmd == 'get':
filename = file.split()[1]
file_size = 0
same = client.recv(1024)
if same == b'same':
print('有相同文件请重新输入')
continue
else:
msg_dic = json.loads(client.recv(1024).decode())
receive_size = msg_dic["filesize"]
print(receive_size)
file = open("%s.new"%filename, "wb")
while receive_size > file_size:
data = client.recv(1024)
file.write(data)
file_size += len(data)
else:
print("get success")
file.close()
if cmd == 'put':
filename = file.split()[1]
filesize = os.stat(filename).st_size
print(filesize)
msg_dic = {"filesize": filesize}
same = client.recv(1024)
if same ==b'same':
print('有相同文件请重新输入')
continue
else:
client.send(json.dumps(msg_dic).encode())
file = open("%s"%filename,"rb")
for line in file:
client.send(line)
else:
print("put%s" %file)
file.close()






if __name__ == '__main__': print("服务端口启动") ftp_server()

 

posted on 2020-05-09 17:53  修治  阅读(178)  评论(0编辑  收藏  举报

导航