原版:

TCP分为客户端(client)和服务器(server),每次服务器只能为客户端提供一次的下载服务。

改良版:

TCP分为客户端(client)和服务器(server),

(1)每次服务器能为客服端循环提供下载服务,

(2)服务器能够识别出不存在的文件并且发送客户端,

(3)客户端能够通过输入退出下载服务,并且服务器能够退出为当前客户端的服务,等待为下一个客户端的服务。

难点:

(1)处理不存在的文件,引入了continue关键字,若不引入,当下载遇到不存在的文件,之前存储上一个文件数据的变量会作为数据发送给客户端!!

(2)客户端和服务器退出当前服务,引入了break关键字。

自学自练,欢迎指正。

 # 客户端
import socket def main(): # 1,创建套接字 tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2,链接服务器
server_ip = input('获取服务器的IP:')
server_port = int(input('获取服务器的端口号:'))
tcp_client.connect((server_ip, server_port))
print('温馨提示:')
print('*'*20)
print('如果想要终止下载文件的请求, 请输入“quit”, 退出下载!')
while True:
# 3,获取要下载的文件名
file_name = input('输入要下载的文件名:') # 4,发送文件名到服务器
send_data = tcp_client.send(file_name.encode('utf-8')) if file_name == 'quit': # 这里if判断语句要放置在send_data之后,让客户端把quit发送到服务器,服务器退出为当前客户端服务,等待为下一个客户端服务。
break # 5,接收数据
recv_data = tcp_client.recv(1024)
if recv_data.decode('utf-8') != '':
# print('接收数据:' ,recv_data.decode('utf-8'))
with open('C:\\Users\\Administrator\\Desktop\\练习生\\网络通信\\'+ '[副本]'+file_name, 'wb') as f:
f.write(recv_data)
else:
print('文件不存在') tcp_client.close() if __name__ == '__main__':
main()

 import socket
def send_2_client(tcp_client, tcp_addr): # 循环为一个客户端服务
while True:
# 1 接收客服端发送的文件名数据或者接收客户端退出下载的请求(quit)
recv_data = tcp_client.recv(1024) file_name = recv_data.decode('utf-8')
print('客户端:%s,请求下载的文件:%s' % (str(tcp_addr),file_name)) # 退出为当前客服端的下载服务
if file_name == 'quit':
break
# 2 读取文件数据 try:
f = open(file_name, 'rb')
send_content = f.read()
f.close() #关闭文件,释放内存
except:
print('文件不存在')
tcp_client.send(''.encode('utf-8'))
continue #当下载的文件不存在时,循环重新开始,等待当前客户端发送新的下载请求 # 3 发送数据
tcp_client.send(send_content)
tcp_client.close() def main():
# 1,创建服务器套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2,绑定地址信息
tcp_server_socket.bind(('', 7788)) # 3,设置为被动监听
tcp_server_socket.listen(128) # 4,循环等待客户端的访问
# 循环为多个客户端服务
while True:
print('等待客服端的访问请求...')
tcp_client, tcp_addr = tcp_server_socket.accept()
send_2_client(tcp_client, tcp_addr)
tcp_server_socket.close() if __name__ == '__main__':
main()

01_基于TCP的循环为同一个客户端下载文件的下载器的更多相关文章

  1. JAVA 基于TCP协议的一对一,一对多文件传输实现

    最近老师给我们上了多线程和TCP和UDP协议,其中一个要求就是我们用JAVA协议一个基于TCP和UDP这两种协议的一对一文件上传和一对多文件上传. 然后我就开始分析TCP和UDP这两个协议的特点,发现 ...

  2. ASP.NET MVC5 之 客户端实现文件的下载

    MVC 实现下载功能主要借助于 File 属性: //下载文件接口 public ActionResult GetTrackTempIsc(ICSModels icsModels) { bool fl ...

  3. 一个基于TCP/IP的服务器与客户端通讯的小项目(超详细版)

    1.目的:实现客户端向服务器发送数据 原理: 2.建立两个控制台应用,一个为服务器,用于接收数据.一个为客户端,用于发送数据. 关键类与对应方法: 1)类IPEndPoint: 1.是抽象类EndPo ...

  4. java实例练习——基于TCP/IP协议的多客户端通信

    先说一下大概的思路: 应用多线程来实现服务器与多客户端之间的通信 1.服务器端创建ServerSocket,循环调用accept()等待客户端连接: 2.客户端创建一个Socket并请求与服务器端连接 ...

  5. (2)socket的基础使用(基于TCP协议)

    socket()模块函数用法 基于TCP协议的套接字程序 netstart -an | findstr 8080 #查看所有TCP和UDP协议的状态,用findstr进行过滤监听8080端口 服务端套 ...

  6. 基于tcp协议的粘包问题(subprocess、struct)

    要点: 报头  固定长度bytes类型 1.粘包现象 粘包就是在获取数据时,出现数据的内容不是本应该接收的数据,如:对方第一次发送hello,第二次发送world,我放接收时,应该收两次,一次是hel ...

  7. python中基于tcp协议的通信(数据传输)

    tcp协议:流式协议(以数据流的形式通信传输).安全协议(收发信息都需收到确认信息才能完成收发,是一种双向通道的通信) tcp协议在OSI七层协议中属于传输层,它上承用户层的数据收发,下启网络层.数据 ...

  8. 基于TCP的安卓客户端开发

    一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户 ...

  9. TCP/IP网络编程之基于TCP的服务端/客户端(二)

    回声客户端问题 上一章TCP/IP网络编程之基于TCP的服务端/客户端(一)中,我们解释了回声客户端所存在的问题,那么单单是客户端的问题,服务端没有任何问题?是的,服务端没有问题,现在先让我们回顾下服 ...

随机推荐

  1. Gradle Goodness: Parse Files with SimpleTemplateEngine in Copy Task

    With the copy task of Gradle we can copy files that are parsed by Groovy's SimpleTemplateEngine. Thi ...

  2. selenium java maven 自动化测试(一) helloworld

    本教程使用selenium-java,简单的完成了网页访问 网页内容获取,表单填写以及按钮点击. 1. 使用maven构建项目 在pom中添加如下依赖: <dependency> < ...

  3. [原创]HBase学习笔记(2)- 基本操作

    1.使用hbase shell连接hbase 2.输入help可以查看帮助 3.输入list查看当前hbase中的所有表 4.使用create创建表test 其中test是表名,cf是列族.该表只创建 ...

  4. 仿手机QQ消息小红点动画2

    前言 上一篇把动画的实现步骤大致理清,需要确认小尾巴的绘制区域,关键就是确定4个顶点的位置.大家可以根据需要,选择不同的计算方式. 今天,要实现: 文字的添加 尾巴拉长用弧形代替直线 下面是现在的效果 ...

  5. python面试题之基础2

    2.3 考虑以下 Python 代码,如果运行结束,命令行中的运行结果是什么? 两者用法相同,不同的是 range 返回的结果是一个列表,而 xrange 的结果是一个生成器,前者是 直接开辟一块内存 ...

  6. celery知多少

    Celery 1.什么是Celery Celery是一个简单.灵活且可靠的,处理大量消息的分布式系统 专注于实时处理的异步任务队列 同时也支持任务调度 Celery架构 Celery的架构由三部分组成 ...

  7. PICT工具一键生成正交试验用例

    PICT工具一键生成正交试验用例 作用: 1.解决手动设计大量测试用例.或覆盖不全面问题,提高测试效率 2.读取excel,将生成的参数组合自动带入脚本,进行接口自动化测试 一.PICT简介 PICT ...

  8. Altera三速以太网IP核快速仿真与使用(上篇)

    对于比较高级的ip核,altera一般都会提供仿真案例,网上有关于这个IP核的各种仿真方法,但都比较繁琐,前几日,朋友跟我分享了一个比较快速高效的仿真方法,这个方法也是他摸索折腾了一段时间才总结出来的 ...

  9. 【Hutool】Hutool工具类之日期时间工具——DateUtil

    一.用于取代Date对象的DateTime对象 再也不用Date SimpleDateFormat Calendar之间倒腾来倒腾去了!日期创建-获取-操作一步到位! 如果JDK版本更新到了8及以上, ...

  10. 20155213 2016-2017-2《Java程序设计》课程总结

    20155213 2016-2017-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:我所期望的师生关系 预备作业2:C语言的学习的回忆 预备作业3:小议linux 第一周作 ...