用python socket模块实现简单的文件下载

server端:

# ftp server端
import socket, os, time

server = socket.socket()
server.bind(("localhost", 8080))
server.listen()
while True:
    conn, addr = server.accept()
    print("连接到客户端:", addr)
    while True:
        try:  # windows会直接报错,需要捕获异常
            data = conn.recv(1024)
            if not data:
                print("客户端已断开")
                break
        except Exception as e:
            print("客户端已经断开")
            break
        cmd, filename = data.decode().split()  # ex: get name.txt
        if os.path.isfile(filename):
            f = open(filename, "rb")
            # 获取文件的字节大小
            size = os.stat(filename).st_size
            conn.send(str(size).encode())  # 发送文件大小
            conn.recv(1024)
            for line in f:   # 客户端确认后发送文件内容
                conn.send(line)
            f.close()
            print("文件下载完成")
        conn.send("not file".encode())
server.close()

  

client端:

import socket

client = socket.socket()
client.connect(("localhost", 8080))
while True:
    cmd = input(">>:").strip()
    if len(cmd)==0: continue
    if cmd.startswith("get"):
        client.send(cmd.encode())  # 发送请求
        server_response = client.recv(1024)
        if server_response.decode().startswith("not"):
            print("请输入有效文件名")
            continue
        client.send(b"ready to recv file")  # 发送确认
        file_size = int(server_response.decode())  # 获取文件大小
        rece_size=0
        filename = cmd.split()[1]
        f = open(filename + ".new", "wb")
        while rece_size < file_size:
            if file_size - rece_size > 1024:  # 要收不止一次
                size = 1024
            else:  # 最后一次了,剩多少收多少,防止之后发送数据粘包
                size = file_size - rece_size
                print("last receive:", size)
            recv_data = client.recv(size)
            rece_size += len(recv_data)  # 累加接受数据大小
            f.write(recv_data)  # 写入文件,即下载
        else:
            print("文件下载完成")
            f.close()
client.close()

  

测试案例:

主要是socket的简单使用,主要节点都有注释

原文地址:https://www.cnblogs.com/houzheng/p/10292889.html

时间: 2024-10-16 00:54:10

用python socket模块实现简单的文件下载的相关文章

用Python socket实现一个简单的http服务器(post 与get 的区别)

预备知识: 关于http协议的基础请参考这里. 关于socket基础函数请参考这里. 关于python网络编程基础请参考这里. 废话不多说,前面实现过使用linux c 或者python 充当客户端来获取http 响应,也利用muduo库实现过一个简易http服务器,现在来实现一个python版的简易http服务器,代码改编自http://www.cnblogs.com/vamei/ httpServer.py Python Code 1 2 3 4 5 6 7 8 9 10 11 12 13

Python socket模块实现TCP服务端客户端

Python socket模块实现TCP服务端客户端 写了详细的注释,如果有哪一行不明白,可留言哦. 服务端脚本 # _*_ coding: utf-8 _*_ __author__ = 'xiaoke' __date__ = '2018/6/13 14:39' # 这个脚本创建一个TCP服务器,它接收来自客户端的消息,然后将消息加上时间戳前缀并返回客户端 import socket from time import ctime HOST = '' PORT = 21567 BUFSIZ = 4

python——socket模块与列表映射

从socket模块学习中的一段奇怪代码说起 前言:在学习python标准库中的Socket模块中,发现了一段奇怪的代码. import socket def get_constants(prefix): dicts=dict((getattr(socket,n),n) for n in dir(socket) if n.startswith('IPPROTO_')) print (dicts) 疑问:上述代码中的for..in..循环语句和if 语句都没有冒号结束.为什么? 答案:因为上述“异常

Python random模块的简单介绍

Python中的random模块是用于生成随机数,我们也可以用他随机生成数字和字符串 random.randint(a,b)  :a到b里的一个随机整数 random.random():用于生成0到1的浮点数,如下图,0.0<x<1.0 random.uniform(a, b):用于生成指定范围的浮点数 ,不管是a大于b还是b大于a,生成的浮点数大小都在ab之间 random.randrange([start], stop [,step]) 从指定范围内,按指定基数递增的集合中获取一个随机数,

python socket模块

基于网络的套接字:AF_INET有两种协议,面向连接的协议TCP: SOCK_STREM,无连接的协议UDP:SOCK_DGRAM 服务端:socket.socket():创建套接字socket.AF_INET,socket.SOCT_STREAM socket.bind():绑定地址(IP地址和端口号)到套接字socket.listen():开始TCP监听socket.accept():被动接受客户端连接,(阻塞式)等待连接的到来 一个简单服务端 #coding:utf-8 import so

python warnings模块的简单应用

最近在学习Bottle源码时发现用到了warnings相关知识,就认真学习了下,记录下来防止忘记 # -*- coding=utf-8 -*- import warnings def fxn():     warnings.warn("deprecated", DeprecationWarning)     print 'this is fxn' fxn() 文件为 fxn.py 运行 python fxn.py 显示 this is fxn 并没有输入警告信息 添加运行参数 -W a

python socket模块:TCP,UDP客户端

__author__ = 'Administrator' import socket # tcp客户端 target_host = 'www.51cto.com' target_port = 80 # AF_INET是标准IPv4地址或主机名,SOCK_STREAM表示是TCP的方式 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 建立连接 client.connect((target_host, target_port)

python argpare 模块的简单用法

1.实例: #!/usr/bin/python #coding:utf-8 import argparse parser = argparse.ArgumentParser() parser.add_argument('-s','--string',dest='string',nargs=1,metavar=('num'),help='you can select 10/15/20') args = parser.parse_args() print args.string 2.参数说明: pa

python ftplib模块编写简单的ftp服务

1 from ftplib import * 2 import os,readline 3 import sys 4 class MyFtp: 5 ftp = FTP() #建立一个ftp对象的链接 6 def __init__(self, host, port='21'): #构造函数初始化 7 self.ftp.connect(host=host,timeout=100) #连接ftp服务器 8 def Login(self, user, passwd): #登录函数 9 self.ftp.