原版:

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. iOS之利用腾讯Bugly程序调试,测试代码bug、卡顿等情况

    1.自己先写一个 Demo 演示一下利用bugly测试崩溃的具体情况. 在ViewController里面实现崩溃代码如下:  运行后 毫无疑问程序报错了! 2.使用到第三方的框架Bugly,官方下载 ...

  2. CentOS6安装各种大数据软件 第十章:Spark集群安装和部署

    相关文章链接 CentOS6安装各种大数据软件 第一章:各个软件版本介绍 CentOS6安装各种大数据软件 第二章:Linux各个软件启动命令 CentOS6安装各种大数据软件 第三章:Linux基础 ...

  3. Linux系统初学-第三课 Linux网络配置1

    Linux系统初学-第三课 Linux网络配置 1.动态IP配置 配置文件路径 /etc/sysconfig/network-scripts/ ls查看网卡eth0,其中HWADDR值得获取:ifco ...

  4. JDK1.8降到1.7技巧

    前言: 最近部署一个产品,该产品不支持JDK1.8,碰巧我的机器安装的是1.8,这就需要降到1.7才能部署启动成功.那么我也是不赞成卸载1.8来安装1.7,因为很多时候可能需要1.8和1.7来回切换. ...

  5. js节点操作实例

    写了一个简单的小例子来引用js实例 1. 初步节点操作: 2.兼容性节点操作: 3.节点的类型,名字: 4.使用setAttribute设置属性 5.节点复制操作: 6.删除和替换节点 如有错误,还望 ...

  6. Java使用多线程实现Socket多客户端的通信

    要想详细了解socket,大家请自行百度,我这里只简单介绍. 在网络中,我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程.而socket编程就是为了完成两个唯一进程之间的通信(一个是客户端, ...

  7. HBase(3)-安装与Shell操作

    一. 安装 1. 启动Zookeeper集群 2. 启动Hadoop集群 3. 上传并解压HBase -bin.tar.gz -C /opt/module 4. 修改配置文件 #修改habse-env ...

  8. C语言中const有什么用途

    自己上网查的资料. 可以定义const常量,具有不可变性.例如:const int Max=100; Max++会产生错误; 便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患.例如: v ...

  9. 什么是PHP7中的孤儿进程与僵尸进程

    什么是PHP7中的孤儿进程与僵尸进程 基本概念 我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程.子进程的结束和父进程的运行是一个异步过程,即父进程永远无法 ...

  10. PTA基础编程题目集6-2多项式求值(函数题)

    本题要求实现一个函数,计算阶数为n,系数为a[0] ... a[n]的多项式f(x)=∑​i=0​n​​(a[i]×x​i​​) 在x点的值. 函数接口定义: double f( int n, dou ...