socket创建的文件下载器

客户端:

# tcp_downloadfile_client.py

import socket
import sys


def main():
    # 创建套接字
    tcp_client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 获取服务器的ip port 
    dest_ip = input('请输入要链接的服务器:')
    dest_port = int(input('请输入要链接的服务器的端口:'))
    dest_addr = (dest_ip,dest_port)
    # 链接到服务器
    tcp_client_socket.connect(dest_addr)
    print('——链接成功——')
    # 获取下载的文件名字
    filename_download = input('请输入要下载的文件名字:')
    # 将文件名字发送到服务器
    tcp_client_socket.send(filename_download.encode('utf-8'))
    # 接收文件中的数据
    recv_data = tcp_client_socket.recv(1024)
    # 保存接受到的数据到一个文件中
    if recv_data:
        with open('download'+filename_download,'wb') as f:
            f.write(recv_data)
        print('下载完成')
    else:
        print('返回为空,请重新输入文件名')
    # 关闭套接字
    tcp_client_socket.close()


if __name__=='__main__':
    main()

服务器端:

# tcp_downloadfile_server.py
import socket


def send_file_to_client(new_client_socket,client_addr):
    # 接受客户端发送过来的要下载的文件名
    recv_file_data = new_client_socket.recv(1024).decode('utf-8')
    if recv_file_data:
        print('客户端{}要下载的文件是:{}'.format(client_addr,recv_file_data))

        print('下载中,请稍等')
        file_content = None
        # 打开这个文件,读取数据
        try:
            f = open(recv_file_data,'rb')
            file_content = f.read()
        except Exception as ret:
            print('服务器未存储客户要下载的文件{}'.format(recv_file_data))
        # 发送数据给客户端消息
        if file_content:
            new_client_socket.send(file_content)
        else:
            return file_content
    else:
        print("***欢迎再次访问***")


def main():
    # 创建套接字
    tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 绑定本地ip和port
    localaddr = ('',8080)
    tcp_server_socket.bind(localaddr)
    # 监听
    tcp_server_socket.listen(128)
    
    while True:
        print('————等待用户提交下载请求————')
        # 等带客户端并分配套接字
        new_client_socket,client_addr = tcp_server_socket.accept()
        print('——用户链接成功——')
        print('——正在等待用户输入查找文件——')
        # 调用发送文件函数,完成为客户端服务
        send_file_to_client(new_client_socket,client_addr)
        # 关闭套接字
        print('——完成服务——')
        print()
        new_client_socket.close()
    tcp_server_socket.close()


if __name__=='__main__':
    main()

 

posted @ 2020-04-05 17:19  Norni  阅读(224)  评论(0编辑  收藏  举报