socket练习

服务端
import os,sys


BASE_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(BASE_DIR)

import socket
import selectors

class selectFtpServer():
    def __init__(self):
        self.sel = selectors.DefaultSelector()
        self.create_socket()
        self.handle()

    def create_socket(self):
        server = socket.socket()
        server.bind(('127.0.0.1',8000))
        server.listen(5)
        server.setblocking(False)
        self.sel.register(server, selectors.EVENT_READ, self.accept)
        print('开启服务。。。')

    def handle(self):
        while True:
            events = self.sel.select()
            for key,mask in events:
                callback = key.data
                callback(key.fileobj,mask)


    def accept(self,sock,mask):
        conn,addr = sock.accept()
        conn.setblocking(False)
        self.sel.register(conn,selectors.EVENT_READ,self.read)

    def read(self,conn,mask):
        try:
            data = conn.recv(1024)
            if not data:
                raise Exception
            print('echoing',repr(data),'to',conn)
            conn.send(data)
        except Exception as e:
            print('closing',conn)
            conn.unregister(conn)
            conn.close()
if __name__ == '__main__':
    selectFtpServer()
 
 

客户端

# -*- coding:utf-8 -*-

import os,sys
import socket
import selectors

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(BASE_DIR)


class selectFtpClient():
    # 初始化
    def __init__(self):
        self.args = sys.argv   # 接收命令行输入
        if len(self.args)>1:  # 如果有值
            self.port = (self.args[1],int(self.args[2]))  # 把ip和端口分别值传给 元组port
        else:
            self.port = ('127.0.0.1',8000)  # 如果没有传入值 默认
        self.create_socket()  # 执行create方法
        self.command_faout()  # 然后执行这个

    def create_socket(self):  # 建立连接
        try:
            self.sk = socket.socket()
            self.sk.connect(self.port)
            print("连接成功。。。")

        except Exception as e:
            print("except: ",e)

    def command_faout(self):   # 输入,输出方法

        while True:   # 无限循环
            cmd = input(">>>").strip()   # 接收输入
            if cmd == "exit()":
                break
            cmd,file = cmd.split()   # 写入文件上传put下载get 和文件文件路径

            if hasattr(self,cmd):  # 判断输入的方法
                func = getattr(self,cmd)   # 如果有就去调用
                func(cmd,file)  # 调用方法 传入值
            else:
                print("调用错误。")

    def put(self,cmd,file):
        if  os.path.isfile(file):
            fileName = os.path.basename(file)
            fileSize = os.path.getsize(file)

            fileInfo = '%s|%s|%s'%(cmd,fileName,fileSize)
            self.sk.send(bytes(fileInfo,encoding="utf-8"))

            recvStatus = self.sk.recv(1024)
            print('recvStatus', recvStatus)
            hasSend = 0
            if str(recvStatus, encoding="utf-8") == 'OK':
                with open(file,'rb') as f:
                    while fileSize > hasSend:
                        contant = f.read(1024)
                        recv_size = len(contant)

                        self.sk.send(contant)

                        hasSend += recv_size
                        s = str(int(hasSend/fileSize*100))+"%"
                        print("正在上传文件:"+fileName+"  已上传:"+s)
                print('%s上传完成'%(fileName,))
        else:
            print("文件不存在")





    def get(self):
        pass





if __name__ == '__main__':
    selectFtpClient()

猜你喜欢

转载自blog.csdn.net/weixin_42100915/article/details/80518847