zoukankan      html  css  js  c++  java
  • 简单的socket_server 和 socket_client(实现文件的上传功能)

    socket_server 

    客户端程序 

    import socket, os, json
    
    
    class Ftcplient(object):
        def __init__(self):
            
            """
            初始化一个socket
            """
            
            self.client = socket.socket()
        def client_connect(self, ip, port): 
            """
          实现端口的连接
            """
        
            
            self.client.connect((ip, port))
      
    
        def help(self):
            """
            帮助窗口
            """
    
            msg = {
                '''
                ls 
                pwd
                cd / 
                get filename
                put filename
                '''
            }
            print(msg)
        def interative(self):
            """
            用户交互程序
            """
            
            while True:
              cmd = input('>>').strip()
              if len(cmd) == 0 or not cmd:
                break
    
              action = cmd.split()[0]      #判断用户输入的动作
              if hasattr(self, 'cmd_' + action):  #如果动作存在调用内部程序,不存在启用帮助程序
                func = getattr(self, 'cmd_' + action)
                func(cmd)
              else:
                  help()
    
        def cmd_load(self, *args):
            """
            上传文件程序
    
            """
            cmd_split = args[0]
            filename = cmd_split.split()[1]
            if os.path.isfile(filename):
                while True:
    
                   size = os.stat(filename).st_size
                   file_msg = {
                       'action':'load',
                       'filename' : filename,
                       'filesize' : size,
                       'overriden' : True
                           }
                   self.client.send(json.dumps(file_msg).encode('utf-8'))
                   f = open(filename, 'rb')
                   self.client.recv(1024)
                   for line in f :
                      self.client.send(line)
    
                   else:
                      print('the file has send finish')
                      f.close()
                      break
    
    
    ftp = Ftcplient()
    ftp.client_connect('localhost', 5500)
    ftp.interative()

    服务器端程序 这里用的是socket_server

    import socketserver, json
    
    
    class MyTCPHandler(socketserver.BaseRequestHandler):  # 条件1,自己创建一个类
        def handle(self):  # 重写父类中的handle()
            """
            socketserver 主要的运行窗口
    
            """
            while True:
    
                self.data = self.request.recv(1024)
                if not self.data or len(self.data) == 0:
                    break
                cmd = self.data.decode()
                cmd = json.loads(cmd)
                action = cmd['action']
    
                if hasattr(self, action):
                    func = getattr(self, action)
                    func(cmd)
    
        def load(self, *args):
            """
            用于文件的下载
    
            """
    
            load_split = args[0]
            filesize = load_split['filesize']
            filename = load_split['filename']
            self.request.send('ok'.encode('utf-8'))
            if len(filename.split('.')) > 0:  #判断输入的文件名是文件格式如1.txt
                f = open('new_'+ filename, 'wb')
                receive_size = 0
                while receive_size < filesize:
                    receive_info = self.request.recv(1024)
                    f.write(receive_info)
                    receive_size += len(receive_info)
    
                #                print("{} wrote:".format(self.client_address[0]))
    
    
    
    if __name__ == "__main__":
        HOST, PORT = "localhost", 5500
        # Create the server, binding to localhost on port 9999
        server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)  # 实例化ThreadingTCPServer,并传递(端口号+IP),和请求类名
        server.serve_forever()  # 关闭
  • 相关阅读:
    poj1019
    poj1017
    .net面试题及答案二
    .net面试题集锦一
    .net面试题目三
    ADO.NET中的五个主要对象
    ASP.NET页面生命周期描述(转)
    学习网址不断更新。。。
    Html5新标签解释及用法
    HTML5 Shiv – 让该死的IE系列支持HTML5吧
  • 原文地址:https://www.cnblogs.com/my-love-is-python/p/9122699.html
Copyright © 2011-2022 走看看