1. 程式人生 > >socket傳送文件

socket傳送文件

結果 防止 字符 lap view data pla os.path 等待

一、文件傳送步驟

  我們要利用socket來實現下載一個文件,該如何操作呢?

  服務端:

  1. 讀取文件名
  2. 判斷文件是否存在
  3. 檢測文件大小(用於和客戶端對比判斷文件是否傳送完畢)
  4. 發送文件大小給客戶端
  5. 等待客戶端確認(防止粘包)
  6. 打開文件
  7. 邊讀邊發送數據
  8. md5驗證

  客戶端:

  • 發送命令
  • 接收文件大小
  • 返回確認
  • 獲取文件名
  • 對比文件大小
  • 寫入文件

二、功能實現(ftp下載功能)

  服務端:

技術分享
# -*- coding: UTF-8 -*-
import os
import socket

# TCP/IP協議, tcp ,如果不填寫就是默認這個
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server.bind((
localhost, 9999)) server.listen() while True: # 可以接受多個客戶端 conn, addr = server.accept() print(new conn, addr) while True: cmd_res = conn.recv(1024) if not cmd_res: # 防止當接受的客戶端數據為空時,程序卡掉 print(client has lost...) break else:
# 獲取命令和文件名 cmd, filename = cmd_res.decode().split() print(cmd, filename) if os.path.isfile(filename): # 判斷文件是否存在 # 文件大小 file_size = os.stat(filename).st_size # 發送文件大小 conn.send(str(file_size).encode(
utf-8)) # 等待客戶端確認 conn.recv(1024) # 打開文件 f = open(filename, rb) for line in f: conn.send(line) f.close()
View Code

  客戶端:

技術分享
# -*- coding: UTF-8 -*-
import socket

client = socket.socket()

client.connect((localhost, 9999))

while True:
    cmd = input(>>:).strip()
    # 判斷是否發送空數據,如果是就重新發送
    if len(cmd) == 0:
        continue
    else:
        client.send(cmd.encode(utf-8))
        # 獲取服務端發送的文件大小
        size = client.recv(1024)
        total_file_size = int(size.decode())
        # 返回確認
        client.send(bfile size received)
        filename = cmd.split()[1]
        print(filename)
        received_size = 0
        # 寫入文件
        f = open(filename + .new, w)
        while received_size < total_file_size:
            r_data = client.recv(1024)
            received_size += len(r_data)
            f.write(r_data.decode(gbk, ignore) + \n)
        else:
            print(file sizes, total_file_size, received_size)
            print(receive finished)
            f.close()
View Code

  運行結果:

  技術分享

  這個程序有缺陷,首先目前只能讀取本文件夾下的文件,其次新生成的文件解碼後還是有部分中文字符亂碼,哎...

三、md5驗證文件

  下周做了,,,

socket傳送文件