网络编程之使用TCP编写简易的文件下载器

一、TCP客户端的实现

"""
客户端
"""
import socket


def main():
    """客户端"""
    # 1.创建tcp的套接字
    tcp_clinet_socket =  socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.链接服务器
    server_ip = input('请输入服务器的ip:')
    server_port = int(input('请输入服务器的port:'))
    server_addr = (server_ip,server_port)
    tcp_clinet_socket.connect(server_addr)
    # 3.收发消息
    send_data = input('请输入发送的消息:')
    tcp_clinet_socket.send(send_data.encode('gbk'))
    # 4.关闭套接字
    tcp_clinet_socket.close()


if __name__ == '__main__':
    main()

二、TCP服务器的实现

"""
服务器
"""
import socket


def main():
    """服务器"""
    # 1.买个手机(创建一个tcp的套接字 socket)
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.装个手机卡(绑定本地信息 bind)
    tcp_server.bind(("", 7890))
    # 3.将手机设置为响铃模式(将默认的套接字由主动变为被动  listen)
    tcp_server.listen(128)
    print('-------1--------')
    # 4.等待别人打电话(等待客户端的链接 accept)
    new_clinet_socket, clinetAddr = tcp_server.accept()
    print('-------2--------')
    print(clinetAddr)
    # 接受客户端发过来的请求
    clinet_data = new_clinet_socket.recv(1024)
    print(clinet_data)
    # 给客户端回一个消息
    new_clinet_socket.send('12345'.encode('gbk'))
    # 关闭套接字
    new_clinet_socket.close()
    tcp_server.close()


if __name__ == '__main__':
    main()

三、案例:简易的文件下载器

  1. 客户端实现
    import socket
    
    
    def main():
        """文件下载客户端"""
        # 1.创建套接字
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 2.获取服务器的ip和prot
        server_ip = '192.168.1.10'
        server_prot = 8080
        # 3.连接服务器
        client.connect((server_ip, server_prot))
        # 4.获取要下载的文件名
        data_file = input("请输入要下载的文件名:")
        # 5.将文件名传递给服务器
        client.send(data_file.encode('utf-8'))
        # 6.接受服务器传来的数据
        data = client.recv(1024)
        if data:
            # 7.保存服务器传来的数据
            with open('new_' + data_file, 'wb') as f:
                f.write(data)
            print('下载成功')
        else:
            print('没有这个文件下载失败')
        # 8.关闭套接字
        client.close()
    
    
    if __name__ == '__main__':
        main()
    
  2. 服务器端实现
    import socket
    
    def send_to_client(new_client, clientaddr):
        """获取客户端的需求,打开文件给客户端发文件内容"""
        # 获取客户端的信息 1024=1k  1024*1024=1M
        file_name = new_client.recv(1024).decode('gbk')
        print('%s客户要下载%s文件' % (clientaddr, file_name))
        file_context = None
        # 打开文件
        try :
            f = open(file_name, 'rb')
            file_context = f.read()
            f.close()
        except:
            print("没有%s文件打开失败" % file_name)
        if file_context:
            # 给客户端回信息 直接发的是二进制类型
            new_client.send(file_context)
            print("%s传输成功" % file_name)
        # 关闭套接字
        new_client.close()
    
    
    def main():
        """文件下载服务器"""
        # 创建套接字
        server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 绑定ip和prot
        server.bind(('192.168.1.10', 8080))
        # 设置成监听模式 listen  128这个值是指同一时刻访问服务器可接受的多与少,但是由于操作系统不同所以多少是不同的,一般默认为128
        server.listen(128)
        # 让客户端多次下载
        while True:
            # 等待用户连接 accept
            new_client, clientaddr = server.accept()
            # 获取客户端的需求给客户端发文件
            send_to_client(new_client, clientaddr)
        # 关闭服务器套接字
        server.close()
    
    
    if __name__ == '__main__':
        main()
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值