Tcp文件下载客户端和服务端,只进行一次

一、客户端

import socket

if __name__ == '__main__':
    tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 链接
    tuple1 = ('192.168.44.128', 8800)
    tcp_client_socket.connect(tuple1)
    while True:
        # 发送消息
        file_url = input('请输入想要下载的文件: ')
        tcp_client_socket.send(file_url.encode('utf-8'))
        str0 = tcp_client_socket.recv(1024)
        
        if str0.decode('utf-8') == '没有':
            print('对不起,您输入的文件不存在!')
            continue
        else:
            print('文件存在,开始下载...')
        # 接收(---接收文件内容)
        # str1 = tcp_client_socket.recv(1024)
        # print(str1.decode('utf-8'))
        # print(type(str1.decode('utf-8')))
        # 创建文件,并输入内容
        try:
            with open(file_url, 'wb') as file:
                while True:
                    str1 = tcp_client_socket.recv(1024)
                    # 判断:
                    if len(str1) == 0:
                        print('下载完毕')
                        break
                    else:
                        file.write(str1)  # 二进制形式写入
        except Exception as value:
            print('文件下载出现异常: ' + value)
        else:
            break

    tcp_client_socket.close()

二、服务端

import socket
import os

if __name__ == '__main__':
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 解除端口占用
    tcp_server_socket .setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 绑定端口
    tuple1 = ('', 8800)
    tcp_server_socket.bind(tuple1)
    # 主动变被动套接字
    tcp_server_socket.listen(32)

    # 每次链接对应一个人
    while True:
        # 创建一个主动套接字,服务于当前链接的客户端socket
        service_client_socket, ip_port = tcp_server_socket.accept()
        recv_data = 0
        while True:
            recv_data = service_client_socket.recv(1024)
            file_url = recv_data.decode('utf-8')
            # 确定是否有此文件
            # os.path.exists(文件路径)  # True/False
            if os.path.exists(file_url):
                service_client_socket.send('有'.encode('utf-8'))
                print(file_url + '文件存在!')
                break
            else:
                service_client_socket.send('没有'.encode('utf-8'))
                print('对方申请了一个不存在的文件!')
                continue

        # 打开文件,然后读取,最后通过死循环传递
        with open(file_url, 'rb') as file:
            # 死循环读取,并发送内容
            while True:
                # 判断,如果读不到了就跳出
                file_data = file.read(1024)
                print(file_url+'文件内容: ', file_data)
                if file_data != b'':
                    service_client_socket.send(file_data)  # 发送内容
                else:
                    print('传输完毕')
                    break

        # 关闭主动套接字
        service_client_socket.close()
    # 被动套接字不用关闭
    # tcp_server_socket.close()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值