<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] 模擬ftp中的get和put命令,實現文件的上傳和下載,用法了`struct`模塊和`socket`模塊 ## 服務端代碼 ``` import socket import subprocess import struct import json import os share_dir=r'/Users/XXX/server/share' def get(conn,cmds): filename = cmds[1] # 以讀的方式打開文件,讀取文件內容發送給客戶端 # 第一步:制作固定長度的報頭 header_dic = { 'filename': filename, # 'filename':'1.mp4' 'md5': 'xxdxxx', 'file_size': os.path.getsize(r'%s/%s' % (share_dir, filename)) } header_json = json.dumps(header_dic) header_bytes = header_json.encode('utf-8') # 第二步:先發送報頭的長度 conn.send(struct.pack('i', len(header_bytes))) # 第三步:再發報頭 conn.send(header_bytes) # 第四步:再發送真實的數據 with open('%s/%s' % (share_dir, filename), 'rb') as f: # conn.send(f.read()) for line in f: conn.send(line) def put(conn,cmds): pass def run(): phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) phone.bind(('127.0.0.1',8912)) phone.listen(5) print('starting...') while True: # 鏈接循環 conn,client_addr=phone.accept() print(client_addr) while True: #通信循環 try: #1、收命令 res=conn.recv(8096) # b'put 1.mp4' if not res:break #適用于linux操作系統 #2、解析命令,提取相應命令參數 cmds=res.decode('utf-8').split() #['put','xxx.mp4'] if cmds[0] == 'get': get(conn,cmds) elif cmds[0] == 'put': input(conn,cmds) except ConnectionResetError: #適用于windows操作系統 break conn.close() phone.close() if __name__ == '__main__': run() ``` ## clinet端代碼 ``` import socket import struct import json download_dir=r'/Users/XXX/client/download' def get(phone,cmds): # 以寫的方式打開一個新文件,接收服務端發來的文件的內容寫入客戶的新文件 # 第一步:先收報頭的長度 obj = phone.recv(4) header_size = struct.unpack('i', obj)[0] # 第二步:再收報頭 header_bytes = phone.recv(header_size) # 第三步:從報頭中解析出對真實數據的描述信息 header_json = header_bytes.decode('utf-8') header_dic = json.loads(header_json) ''' header_dic={ 'filename': filename, #'filename':'1.mp4' 'md5':'xxdxxx', 'file_size': os.path.getsize(filename) } ''' print(header_dic) total_size = header_dic['file_size'] filename = header_dic['filename'] # 第四步:接收真實的數據 with open('%s/%s' % (download_dir, filename), 'wb') as f: recv_size = 0 while recv_size < total_size: line = phone.recv(1024) # 1024是一個坑 f.write(line) recv_size += len(line) print('總大小:%s 已下載大小:%s' % (total_size, recv_size)) def put(phone,cmds): pass def run(): phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.connect(('127.0.0.1',8912)) while True: #1、發命令 inp=input('>>: ').strip() #get a.txt if not inp:continue phone.send(inp.encode('utf-8')) cmds=inp.split() #['get','a.txt'] if cmds[0] == 'get': get(phone,cmds) elif cmds[0] == 'put': put(phone,cmds) phone.close() if __name__ == '__main__': run() ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看