zoukankan      html  css  js  c++  java
  • socketserver + ftp

    --------------------------------------------生活不止眼前的苟且,还有诗和远方的田野.

    day 29 socketserver + ftp 

    # # ------------------------------------------------------------------------------------------------------------#.
    # # --------------[socketserver示例客户端]--------------
    import socket
    import time
    client = socket.socket()
    client.connect(('127.0.0.1',8001))

    while 1:
    client_data = input('别开车>>>')
    client.send(client_data.encode('utf-8'))

    from_server_msg = client.recv(1024)
    print(from_server_msg.decode('utf-8'))

    client.close()
    # # --------------[socketserver示例服务端]--------------

    import socketserver

    class KnightServer(socketserver.BaseRequestHandler):

    def handle(self):
    # self.request 相当于conn链接通道
    while 1:
    from_client_msg = self.request.recv(1024)
    print(from_client_msg.decode('utf-8'))
    server_msg = input('服务端说>>>')
    self.request.send(server_msg.encode('utf-8'))


    if __name__ == '__main__':
    ip_port = ('127.0.0.1',8001)
    server = socketserver.ThreadingTCPServer(ip_port,KnightServer)
    server.serve_forever()




    # # --------------[ftp上传实例客户端]--------------
    import socket
    import json
    import os
    import struct
    client = socket.socket()

    client.connect(('127.0.0.1',8001))
    file_size = os.path.getsize(r'D:python_workspaceday029xxx.mp4')
    #定义了一个文件描述信息,以字典的形式
    file_info_dict = {
    'file_path': r'D:python_workspaceday029xxx.mp4',
    'file_name': 'xxx.mp4',
    'file_size':file_size
    }

    def login():

    print('欢迎来到登录页面')
    username = input('请输入用户名>')
    password = input('请输入密码>')
    #将用户名和密码拼接成一个字符串
    user_info = username + '|' + password
    client.send(user_info.encode('utf-8'))

    #如果服务端的状态码为200,登录成功,如果不是,登录失败,登录成功,这个信息就是服务端的功能信息
    from_server_status = client.recv(1024).decode('utf-8')
    if from_server_status == '201':
    print('登录失败')
    else:
    all_file_size = 0
    #接收的是一个json格式的字符串
    server_func_list = json.loads(from_server_status)
    #打印了功能信息
    print(server_func_list) #{'1': '上传', '2': '下载'}
    client_func_choice = input('请输入要选择的功能序号>>>')
    #选择1,说明要上传
    if client_func_choice == '1':
    # 上传或者下载的功能序号添加到了文件描述信息的字典中
    file_info_dict['func_choice'] = client_func_choice
    file_dict_json = json.dumps(file_info_dict,ensure_ascii=False)
    #发送文件描述信息
    client.send(file_dict_json.encode('utf-8'))
    #
    with open(file_info_dict['file_path'],'rb') as f:
    while all_file_size < file_info_dict['file_size']:
    every_read_data = f.read(1024)
    client.send(every_read_data)
    every_read_datalen = len(every_read_data)

    all_file_size += every_read_datalen


    def register():
    print('注册')



    print('-----请登录------')
    print('1:登录 2:注册')

    #选择登录
    function_choice = input('请输入你要选择的功能序号>>>>')
    #通过选择的序号,找到对应的函数执行,一个字典搞定
    function_dict = {'1':login,'2':register}

    function_dict[function_choice]()


    # # --------------[ftp上传实例服务端]--------------

    import socket
    import time
    import json
    server = socket.socket()

    server.bind(('127.0.0.1',8001))
    server.listen()

    conn,addr = server.accept()

    def upload(conn,client_file_info):
    #
    upload_file_path = r'D:jj' + '\' + client_file_info['file_name']
    recv_all_datalen = 0
    with open(upload_file_path,'wb') as f:
    while recv_all_datalen < client_file_info['file_size']:
    every_recv_data = conn.recv(1024)
    every_recv_datalen = len(every_recv_data)
    recv_all_datalen += every_recv_datalen
    f.write(every_recv_data)

    print('客户端上传文件')


    client_userinfo = conn.recv(1024).decode('utf-8')
    #定义一个需要返回给服务端的功能列表
    server_function_list = {'1':'上传','2':'下载'}
    #将功能字典转换为json字符串,然后进行编码,转成bytes类型
    json_func_list = json.dumps(server_function_list,ensure_ascii=False)


    #服务端登录认证
    with open('userinformation','r',encoding='utf-8') as f:
    for i in f:
    if i.strip() == client_userinfo:
    #登录成功以后,将服务端能够提供的功能,发送给客户端
    conn.send(json_func_list.encode('utf-8'))
    #接收客户端的文件描述信息,其中有一项是功能序号
    client_fileinfo_json = conn.recv(1024).decode('utf-8')
    client_file_info = json.loads(client_fileinfo_json)

    print(client_file_info)
    if client_file_info['func_choice'] == '1':
    upload(conn,client_file_info)

    break
    else:
    #登录错误的信息码
    conn.send(b'201')

























  • 相关阅读:
    Socket的应用案例
    利用XStream实现对象XML话
    策略模式
    深入理解Java引用类型
    java 消息机制 ActiveMQ入门实例
    activity工作流表结构分析
    Spring MVC 之 Hello World
    如何发布Web项目到互联网
    ionic开发ios app
    ionic开发android app步骤
  • 原文地址:https://www.cnblogs.com/dealdwong2018/p/10020515.html
Copyright © 2011-2022 走看看