基于tcp的下载文件,以及struct模块的应用。

一 基于TCP的下载

客户端:

from socket import *
import os
def main():
    tcp_socket = socket(AF_INET, SOCK_STREAM)# 建立套接字
    tcp_ip = input("请输入ip:")
    tcp_port = int(input("请输入端口:"))# 接收用输入的服务器端的ip和端口
    tcp_socket.connect((tcp_ip, tcp_port))# 连接服务器
    file_name = input("请输入要下载的文件名:")# 输入要下载的文件名
    tcp_socket.send(file_name.encode())# 将文件名发送至服务器端
    new_file = open(file_name, "wb")# 创建一个空文件
    time = 0# 用于计算读取的字节数
    while True:
        mes = tcp_socket.recv(1024)# 接收服务器端返回的内容
        if mes:# 如果内容不为空执行
            new_file.write(mes.decode())# 解码并向文件内写入
            time += len(mes)# 计算字节
        else:
            if time == 0:# 如果字节数为空即未收到内容
                new_file.close()# 关闭文件
                os.remove(file_name) # 删除刚刚创建的文件
                print("没有您要下载的文件")
            else:
                print("文件下载成功") # 如过time有值时name文件传输完成
            break
    tcp_socket.close() # 关闭套接字
if __name__ == '__main__':
 main()

服务端:

import socket
def file_deal(file_name):# 定义函数用于处理用户索要下载的文件
    try:
        files = open(file_name, "rb") # 二进制方式读取
        mes = files.read()
    except:
        print("没有该文件")
    else:
        files.close()
        return mes
def main():
    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 创建套接字
    tcp_socket.bind(("",8080)) # 固定端口号
    tcp_socket.listen(128)# 将主动套接字转为被动套接字,监听连接客户端
    while True:
        client_socket,client_addr = tcp_socket.accept()# 利用accept获取分套接字以及客户端的地址
        file_name = client_socket.recv(4096)# 接收客户端的数据
        mes = file_deal(file_name)# 调用函数处理用户下载的文件
        if mes:# 如果文件不为空发送
            client_socket.send(mes)
        client_socket.close()#关闭分套接字
if __name__ == "__main__":
    main()

猜你喜欢

转载自www.cnblogs.com/zhangsanfeng/p/8976974.html