码迷,mamicode.com
首页 > 其他好文 > 详细

socket传送文件

时间:2017-10-29 16:44:47      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:对比文件   one   中文字符   gif   功能实现   lap   nis   存在   操作   

一、文件传送步骤

  我们要利用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传送文件

标签:对比文件   one   中文字符   gif   功能实现   lap   nis   存在   操作   

原文地址:http://www.cnblogs.com/bigberg/p/7750182.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!