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

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

注意:仅传送1KB之内文件大小,多点能够自行修改,单纯修改文件大小会形成其余错误
文件目录,大小等都可修改
另外由于服务端须不停接收客户端请求,故死循环没有设置跳出条件,可自行更改web

简单介绍服务器

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

客户端代码:

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()

实验截图:

在这里插入图片描述