Python语言使用Socket实现TCP协议的客户端与服务器端,实现文件下载器功能

Python语言Socket使用TCP协议模拟模拟客户端与服务器端,实现文件下载器功能

注意:仅传送1KB以内文件大小,多点可以自行修改,单纯修改文件大小会造成其他错误
文件目录,大小等均可修改
另外因为服务端须不停接收客户端请求,故死循环没有设置跳出条件,可自行更改

简单介绍

1.首先打开服务器端,会自行绑定IP端口信息
2.打开客户端,输入要链接的服务器IP,端口与文件名(本目录下)
3.服务端检测该目录下是否有该文件,并选择进行发送或者异常处理操作
4.客户端经过确认后会建立该文件副本在本目录下
其余的注释完善,自行理解!

客户端代码:

import socket


def main():
    # 1.创建套接字
    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.绑定IP信息
    tcp_socket.bind(("", 5773))
    # 3.链接服务器
    tcp_socket.connect((input("Server IP:"), int(input("Server Port:"))))
    # 4.发送要下载的文件名
    file_name = input("File name:")
    tcp_socket.send(file_name.encode("gbk"))
    # 接收服务器文件消息
    recv_data = tcp_socket.recv(1024)

    # 如果接收消息不为空,执行写入
    if recv_data:
        # 写入到[new]filename文件中
        with open('./[new]' + file_name, 'wb') as f:
            f.write(recv_data)
        print("Download Succeed!")
    else:
        print("Download Fail")

    # 关闭套接字
    tcp_socket.close()


if __name__ == '__main__':
    main()

服务器端代码:

from socket import *


def server_2_client(new_client_socket, client_addr):
    """服务器发送文件函数"""
    # 获取文件名
    file_name = new_client_socket.recv(1024).decode("utf-8")
    print("%s Need %s" % (client_addr, file_name))
    file_content = None

    # 防止没有文件或者权限造成的错误
    try:
        file = open(file_name, 'rb')  # 打开文件
        file_content = file.read()  # 读取文件
        file.close()  # 关闭文件
    # 未找到文件异常处理
    except Exception as ret:
        print("Not Found File!")

    # 若内容非空,发送文件
    if file_content:
        new_client_socket.send(file_content)
        print("OK__Send Succeed!")


def main():
    # 创建套接字
    tcp_socket = socket(AF_INET, SOCK_STREAM)
    # 绑定IP
    tcp_socket.bind(("", 5577))
    # 设置监听
    tcp_socket.listen(128)
    # 服务多个客户端
    while True:
        # 接收新客户端与信息
        new_client_socket, client_addr = tcp_socket.accept()
        # 调用文件发送函数
        server_2_client(new_client_socket, client_addr)
        # 关闭新客户端套接字
        new_client_socket.close()

    # 关闭套接字,未作停止处理
    tcp_socket.close()


if __name__ == '__main__':
    main()

实验截图:

在这里插入图片描述

发布了44 篇原创文章 · 获赞 68 · 访问量 5112

猜你喜欢

转载自blog.csdn.net/qq_25404477/article/details/104151292