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的服务端/客户端(一)中,我们解释了回声客户端所存在的问题,那么单单是客户端的问题,服务端没有任何问题?是的,服务端没有问题,现在先让我们回顾下服 ...
随机推荐
- CCF认证201803-1 跳一跳
import java.util.Scanner; public class Jump { public static void main(String[] args) { Scanner sc = ...
- mysql修改数据表自增步长
可以修改系统变量 auto_increment_increment mysql> SHOW VARIABLES LIKE 'auto_inc%'; +---------------------- ...
- Notes 20180506 : Java程序设计语言概述
2.Java程序设计语言概述 如果对于开发语言的排行榜有所关注的话,那么会发现很长一段时间以来Java都是位居榜首的高级开发语言,作为一个Java开发者,为此感到骄傲的同时也深感忧虑,骄傲的是自己接触 ...
- ODI使用流程
---恢复内容开始--- ODI流程 Topology 1.建立 源 物理结构体系 2.建立 目的 物理结构体系 步骤同上 3.建立 源 逻辑架构 4.建立 目的 逻辑架构 步骤同上 Designer ...
- iOS之限制TextField的输入长度
网上有很多限制textField输入长度方法,但是我觉得都不是很完美,准确来说可以说是不符合实际开发的要求,因此在这里整理一下textField限制输入长度的方法.我所采用的并不是监听方法而是最不同的 ...
- iframe空白
优酷网页上复制的通用代码用来播放视频,浏览器和谷歌模拟器正常,但是发布后手机上打开一片空白,一直以为是苹果手机不支持iframe,最后发现是由于iframe播放链接是http的,而我们网页是https ...
- error:0906D064:PEM routines:PEM_read_bio:bad base64 decode
今天在使用easywechat对接企业打款到银行卡时,遇到了两个错误 error:0906D064:PEM routines:PEM_read_bio:bad base64 decode 和 erro ...
- Kb Article Helper
using System; using Microsoft.Xrm.Sdk; using Microsoft.Crm.Sdk.Messages; using Microsoft.Xrm.Sdk.Que ...
- 跟着马哥学python-day02
1. 运算符 计算机可以进行的运算有很多种,可不只加减乘除这么简单,运算按种类可分为算数运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.位运算. 1.1 算数运算 以下假设变量:a=10,b= ...
- Laravel框架定时任务2种实现方式示例
本文实例讲述了Laravel框架定时任务2种实现方式.分享给大家供大家参考,具体如下: 第一种 1.生成一个commands文件 > php artisan make:command test ...