python基礎實現tcp文件傳輸


准備工作,實現文件上傳需要那些工具呢?

  socket(傳輸)、open()(打開文件)、os(讀取文件信息),當然還有輔助類sys和json,下面我們開始吧

import socket,sys
import json,os

#創建socket對象
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#獲取本地主機名
host = socket.gethostname()

#設置端口號
port = 9000

#綁定端口
server.bind((host,port))

#設置最大連接數
server.listen(5)

#建立連接
while True:
    print('開始監聽')
    #建立客戶端連接
    clint,addr = server.accept()
    print("連接地址: %s" % str(addr))
    #接收文件屬性數據,創建文件
    jsonObj = json.loads(clint.recv(1024).decode('utf-8'))
    print('接收到數據',jsonObj)
    if not jsonObj :
        os.mknod(jsonObj['name'])
    msg = json.dumps({'name':'消息','信號':'創建成功'})
    #回數據確認已經建立新文件
    clint.send(msg.encode('utf-8'))
    #接收數據
    size = 0
    sizeValue = int(jsonObj['size'])
    print('開始接收數據')
    with open(jsonObj['name'], 'wb') as file:
        while size < sizeValue:
            value = sizeValue - size
            if value >1024:
                getdate = clint.recv(1024)
            else :
                getdate = clint.recv(value)
            file.write(getdate)
            size += 1024
    print('結束')
    #關閉連接
    clint.close()

 

客戶端

'''發送文件
Usage:
clint.py <name> [<rename>]

'''
import socket
import os,json,sys

#建立json數據,包含文件名以及大小
#{name:name,size:99999}
date = {}
if len(sys.argv) == 2:
    print(type(sys.argv[1]))
    name = sys.argv[1].split('\\')[-1]
    date['name'] = name
else:
    date['name'] = sys.argv[2]
date['size'] = os.path.getsize(sys.argv[1])
jsonString = json.dumps(date).encode('utf-8')

#create connection
clint = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 獲取本地主機名
host = socket.gethostname()
# 設置端口好
port = 9000
# 連接服務,指定主機和端口
clint.connect((host, port))
#發送文件屬性信息
clint.send(jsonString)
#接收服務端發過來的確認信息
clint.recv(1024)
#發送文件數據
size = 0
with open(sys.argv[1],'rb') as file:
    while size < date['size']:
        fileDate = file.read(1024)
        clint.send(fileDate)
        size += 1024
#關閉連接
clint.close()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM