socket 模拟 文件下载器

服务端代码:

import socket
def send_file_2_client(conn, addr):
    # 1.读取客户端请求
    file_name = conn.recv(1024).decode('utf-8')
    print('客户端[%s]要下载的文件名:%s' % (str(addr[0]), file_name))
    file_content = None
    # 2.打开文件读取数据
    try:
        f = open(file_name, 'rb')
        file_content = f.read()
        f.close()
    except:
        print('文件不存在')
    # 3.发送文件给客户端
    if file_content:
        conn.send(file_content)
def main():
    # 1.创建套接字
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.绑定监听
    server.bind(('127.0.0.1', 9999))
    server.listen(128)
    print('------服务器连接成功------')
    # 3.接收数据,生成新的套接字
    while True:
        conn, addr = server.accept()
        print(addr)
        # 4.调用发送文件函数
        send_file_2_client(conn, addr)
        # 5.关闭套接字
        conn.close()
    server.close()
if __name__ == '__main__':
    main()

客户端代码

import socket
def main():
    # 1.创建套接字
    client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 2.获取服务器ip port 并连接
    client.connect(('127.0.0.1',9999))
    print('-------连接成功-------')
    # 3.获取下载文件的名字并发送给服务器
    file_name = input('请输入要下载的文件名:')
    client.send(file_name.encode('utf-8'))
    # 4.接收文件中的数据
    recv_data = client.recv(1024)
    # 5.保存接收到的数据并保存到文件中
    if recv_data:
        with open('new'+file_name,'wb') as f:
            f.write(recv_data)
    # 6.关闭套接字
    client.close()
if __name__ == "__main__":
    main()

同级目录下先准备好一个文件当作服务端文件,下载本地后拼接新的名字,如果要下载的文件不存在会提示报错!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容