01_基于TCP的循环为同一个客户端下载文件的下载器
原版:
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的循环为同一个客户端下载文件的下载器的更多相关文章
- JAVA 基于TCP协议的一对一,一对多文件传输实现
最近老师给我们上了多线程和TCP和UDP协议,其中一个要求就是我们用JAVA协议一个基于TCP和UDP这两种协议的一对一文件上传和一对多文件上传. 然后我就开始分析TCP和UDP这两个协议的特点,发现 ...
- ASP.NET MVC5 之 客户端实现文件的下载
MVC 实现下载功能主要借助于 File 属性: //下载文件接口 public ActionResult GetTrackTempIsc(ICSModels icsModels) { bool fl ...
- 一个基于TCP/IP的服务器与客户端通讯的小项目(超详细版)
1.目的:实现客户端向服务器发送数据 原理: 2.建立两个控制台应用,一个为服务器,用于接收数据.一个为客户端,用于发送数据. 关键类与对应方法: 1)类IPEndPoint: 1.是抽象类EndPo ...
- java实例练习——基于TCP/IP协议的多客户端通信
先说一下大概的思路: 应用多线程来实现服务器与多客户端之间的通信 1.服务器端创建ServerSocket,循环调用accept()等待客户端连接: 2.客户端创建一个Socket并请求与服务器端连接 ...
- (2)socket的基础使用(基于TCP协议)
socket()模块函数用法 基于TCP协议的套接字程序 netstart -an | findstr 8080 #查看所有TCP和UDP协议的状态,用findstr进行过滤监听8080端口 服务端套 ...
- 基于tcp协议的粘包问题(subprocess、struct)
要点: 报头 固定长度bytes类型 1.粘包现象 粘包就是在获取数据时,出现数据的内容不是本应该接收的数据,如:对方第一次发送hello,第二次发送world,我放接收时,应该收两次,一次是hel ...
- python中基于tcp协议的通信(数据传输)
tcp协议:流式协议(以数据流的形式通信传输).安全协议(收发信息都需收到确认信息才能完成收发,是一种双向通道的通信) tcp协议在OSI七层协议中属于传输层,它上承用户层的数据收发,下启网络层.数据 ...
- 基于TCP的安卓客户端开发
一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户 ...
- TCP/IP网络编程之基于TCP的服务端/客户端(二)
回声客户端问题 上一章TCP/IP网络编程之基于TCP的服务端/客户端(一)中,我们解释了回声客户端所存在的问题,那么单单是客户端的问题,服务端没有任何问题?是的,服务端没有问题,现在先让我们回顾下服 ...
随机推荐
- 用jQuery-Easy-UI编写注册页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Oracle条件查询
Oracle条件查询 参考网址:http://www.oraclejsq.com/article/010100259.html Oracle条件查询时经常使用=.IN.LIKE.BETWEEN...A ...
- iOS开发--MQTT实时处理数据
一. MQTT 一个物联网项目中用到了MQTT协议, 可以用来做设备与软件之间的互通. MQTT: 即时通讯协议, 传输层协议 二. 常用: 1.MQTTKit(已经不维护了) 2.MQTTClien ...
- C++程序设计入门 引用和动态内存管理学习
引用: 引用就是另一个变量的别名,通过引用所做的读写操作实际上是作用于原变量上. 由于引用是绑定在一个对象上的,所以定义引用的时候必须初始化. 函数参数:引用传递 1.引用可做函数参数,但调用时只需 ...
- hubilder 打包app ios高版本不支持问题
<script type="text/javascript"> document.addEventListener('plusready', function(){ v ...
- xftp
SFTP.FTP 文件传输软件. 所有通过该软件的网络流量都是加密的. 1.点击新建 2.新建一个链接 3.点击确定,保存,然后点击该链接 4.链接服务器成功后,如下图右侧,可以增删改查文件.左侧文件 ...
- MySQL的主从复制+双主模式
MySQL的主从复制 部署环境: MySQL master 192.168.40.21 MySQL slave 192.168.40.22 思路: 当主MySQL上进行数据上的操作或者变化时,主My ...
- 微信小游戏websocket支持https/wss
公司新项目需要支持wss,解决方法如下: https://blog.csdn.net/peter_teng/article/details/82866613 proxy_pass http://web ...
- 十个常见的Java异常出现原因
异常是 Java 程序中经常遇到的问题,我想每一个 Java 程序员都讨厌异常,一 个异常就是一个 BUG,就要花很多时间来定位异常问题. 1.NullPointerException 空指针异常,操 ...
- 请简述以下两个for 循环的优缺点
今天笔试时候遇到一个问题,找到相似的. ; i<N; i++) { if (condition) DoSomething(); else DoOtherthing(); } if (condit ...