socketserver网络编程简单的小例子

1:网络编程之socketserver

1:首先socketserver 服务器调用socketserver 模块

2:继承了socketserver.BaseRequestHandler

3:在父类的基础上重写了handle

下面是一个简单的文件登录文件上传的例子

server端

import socketserver
import json
import struct
import socket

class MyTCPHandler(socketserver.BaseRequestHandler):


def handle(self):
    flag = self.login_check()
    while flag:
        try:
            self.data = self.request.recv(1024).strip()
            print('{} wrote'.format(self.client_address[0]))
            print(self.data)
            self.request.send(self.data.upper())
            print(self.data.decode('utf-8'))
            if self.data.decode('utf-8') == '2':
                self.uploading()

        except ConnectionResetError as e:
            print('error', e)
            break

def login_check(self):
    dic_user = {
        'name': 'qwer',
        'pwad': '1234'
    }
    dic_clinet = self.request.recv(1024).strip()
    dic_clinet = json.loads(dic_clinet)
    print(dic_clinet)
    if dic_user['name'] == dic_clinet['name'] and \
            dic_user['pwad'] == dic_clinet['pwad']:
        self.request.send(b'True')
        return True

def uploading(self):
    '''接受上传文件'''
    ret = self.request.recv(1024)
    dic_client = json.loads(ret)
    print(dic_client)
    self.request.send(b'Start To upload')
    print('Start the download')
    size = dic_client['size']
    with open(dic_client['filename'],'wb') as f:
        while size:
            ret = self.request.recv(1024)
            f.write(ret)
            size -= len(ret)
    print('下载完毕!')



if __name__ == '__main__':
    Host, port = '127.0.0.1', 9999
    # sever = socketserver.TCPServer((Host, port), MyTCPHandler)
    sever = socketserver.ThreadingTCPServer((Host, port), MyTCPHandler)
    sever.serve_forever()

client端

import socket
import json
import os
import sys
import time

#进度条
import time
from tqdm import tqdm

# for i in tqdm(range(100)):
#     time.sleep(0.05)

def processBar(num, total):

    rate = num / total
    rate_num = int(rate * 100)
    if rate_num == 100:
        r = '\r%s>%d%%\n' % ('|' * rate_num, rate_num,)
    else:
        r = '\r%s>%d%%' % ('|' * rate_num, rate_num,)
    sys.stdout.write(r)
    sys.stdout.flush


class Client():
    '''客户端'''
    cmd_list = [
        ('下载文件', 'ncftpget'),
        ('上传文件', 'upload'),
        ('切换目录', 'chdir'),
        ('创建目录', 'create_directory'),
        ('删除文件或者目录','expurgate '),
    ]
    def __init__(self):
        self.client = socket.socket() #实例socket对象
    def connect(self, ip, port):
        '''绑定端口'''
        self.client.connect((ip, port))
    def logon(self):
        '''用户登录'''
        name = input('user_name:')
        pawd = input('passwork:')
        user_dic = {
            'name': name,
            'pwad': pawd
        }
        self.client.send(json.dumps(user_dic).encode('utf-8'))
        ret = self.client.recv(1024).decode('utf-8')
        print(ret)
        return ret
    def User_input(self):
        flag = self.logon()
        name_path = '/home/'
        while flag:
            for index, val in enumerate(self.cmd_list, 1):
                print('%s  %s'%(index, val[0]))
            inp = input('%s:'%name_path)
            self.client.send(inp.encode('utf-8'))
            ret = self.client.recv(1024).decode('utf-8')
            if inp == '2':
                self.upload()

        else:
            print('密码错误!')

    def ncftpget(self):
        '''下载文件'''
    def upload(self):
        '''上传文件'''
        path_name = r'G:\python笔记\Pythonjing\day18\video\01 深圳校区 python fullstuck 1期 day18 内容回顾.mp4'
        size = os.path.getsize(path_name)
        print(size)
        total = size
        dic_user = {
            'means': 'uploading',
            'filename': 'test.mp4',
            'size': size,
        }
        self.client.send(json.dumps(dic_user).encode('utf-8'))
        ret = self.client.recv(1024)
        print(ret)
        with open(path_name, 'rb') as f:
            count = 0
            time_old = time.clock()
            pbar = tqdm(total=size)
            while size:
                data = f.read(1024)
                self.client.send(data)
                size -= len(data)
                count += len(data)

                pbar.update(len(data)) #进度条

                # processBar(count, total) #进度条
            time_new = time.clock()
            pbar.close()
            print('上传完毕!一个用时%s秒'%int(time_new - time_old))


    def chdir(self):
        '''切换目录'''
    def create_directory(self):
        '''创建目录'''
    def expurgate(self):
        '''删除文件或者文件夹'''

if __name__ == '__main__':
    # Host, port = '127.0.0.1', 9999
    Host, port = '192.168.16.46', 9999
    cl = Client()
    cl.connect(Host, port)
    cl.User_input()

 

posted @ 2018-09-17 22:19  雷文轩  阅读(311)  评论(0编辑  收藏  举报