TPC 网络通信基础(二)

news/2024/12/6 18:52:29/

文件下载利用 tcp原理

Ubuntu 20.04   python3.7

三个python文件  客户端.py  服务器.py   文件.py

客户端充当用户

服务器充当提供下载的服务端

客户端代码: 

import socketdef main():# 创建套接字tcp_socket = socket.socket(socket.AF_INET,socket.SOCKET_STEAM)#获取服务器的ip和地址dest_ip = input("请输入服务器的ip: ")dest_port = input("请输入服务器的port:")#链接服务器tcp_socket.connect((dest_ip,dest_port))# 获取下载的文件名称download_file_name = input("请输入要下载的文件名称")# 将文件名称发送到服务器tcp_socket.send(download_file_name.encode('utf-8'))#接受文件中的数据recv_data = tcp_socket.recv(1024*1024)if recv_date:# 保存接收到的数据到一个文件中with open('下载内容' + download_file_name,'wb') as f:f.write( recv_data)# 关闭套接字tcp_socket.close()if __name__ == "main":main()

# 服务器端:

def send_file_client(new_client_socket,client_addr):#接收客户端法发来下载文件请求file_name = new_client_socket.recv(1024).decode('utf-8')#打印文件名称。print('客户端%s需要下载的文件名称是%s'%(str(client_addr),file_name))# 先定义content 为none 因为你不确定 有没有这个文件,假如没有# try 中包裹的可能发生异常的代码中 file_content 变量  如果没有文件 说明对象f 执行报错,f后面的#代码就不会被执行所以变量file_content 没有定义成功,那么在测试  if  content :  是不是会报错啊#所以我在最好在前面定义它为空,即便在try 中 它存在数据,但是请你记得python 的执行流程  他会覆盖掉空#如果有则会判断有,如果没有 if file_content: 就会是noe,则不会向客户端会送数据,报出try 中没有文件的提示 不发送返回数据 关闭套接字#打开文件读取数据try:f = open(file_name,'rb')file_content = f.read()except Exception as ret:print("s%文件打开失败"% file_name)#发送输入给客户端# 如果打开 file_name 中存在数据将会给客户端返回收据if file_content:new_client_socket.send(file_content)def main():# 创建套接字tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)tcp_server_socket.bind(('',7788))#让默认的套接字由主动变为被动listentcp_server_socket.listen(256)while True:new_client_socket,client_addr = tcp_server_socket.accept()send_file_client(new_client_socket,client_addr)new_client_socket.close()# new_client_socket.close()只是关闭了为本次服务的套接字,等待开起下次服务tcp_server_socket.close()if __name__ == "__main__":main()

文件.python 

cd 桌面/opt/

vim 客户端.py   

将客户端中的代码写入其中

vim 服务器.py

将服务器端的代码写入其中

vim 文件.py

 将“  啊哈哈哈哈” 填入其中即可

当客户端向服务器发送下载文件.py的请求时,服务器会打开文件.py  这个文件 会读取里面的内容,将数据发送给客户端,客户端会创建一个 下载文件+ file_name文件 将传入的数据  '啊哈哈哈哈'写入到其中,保存起来

在结束完成交互后 通过命令执行  vim  下载文件文件.py  会发现刚才在服务器中打开的文件内容。 

交互操作模拟了下载流程


http://www.ppmy.cn/news/70450.html

相关文章

String StringBuilder常用方法总结

在java中String类不可变的,创建一个String对象后不能更改它的值。所以如果需要对原字符串进行一些改动操作,就需要用StringBuilder类或者StringBuffer类,StringBuilder比StringBuffer更快一些,缺点是StringBuilder不是线程安全的&…

JAVA面试-语法基础- A01

语法基础 面向对象封装继承多态 面向对象 面向对象特性 封装 利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分隔的独立实体,数据被保护在抽象数据类型的内部,尽可能的隐藏内部的细节,只保留一些对外的接口…

前端通信-服务端发送事件: SSE(Server-Sent Events)

在日常开发中,我们经常会遇到需要实时获取数据的情况,之前实现这种相似的功能通常都是用ajax长轮询,在HTML5规范中定义了新的通信方式,WebSocket和SSE。websocket相对SSE更常用一些,本文着重来介绍SSE的应用。 SSE AP…

滨州申请专利需要准备哪些材料?

如果你想保护你的一些发明和设计,你可以申请专利。申请专利时,需要提前了解程序和相关流程。那么,申请专利需要准备哪些材料呢?让我们一起仔细看看。 首先,申请专利需要准备哪些材料? (1)外观专利&#xff…

C++学习 Day14

目录 1. 泛型编程 2. 函数模板 2.1 函数模板概念 2.2 函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5 模板参数的匹配原则 3. 类模板 3.1 类模板的定义格式 3.2 类模板的实例化 1. 泛型编程 如何实现一个通用的交换函数呢? void Swap(int&a…

德尔玛IPO首日破发,市值蒸发超4亿

今日(5月18日),小米“代工厂”广东德尔玛科技股份有限公司(下称“德尔玛”,301332.SZ)正式在深交所挂牌上市。 德尔玛此次IPO募资净额为12.31亿元,开盘价为14.81元/股,与发行价持平…

【Linux内核解析-linux-5.14.10】文件系统知识点以及解答(建议收藏)

什么是Linux文件系统? 答:Linux文件系统是一种用于管理和组织计算机上数据的方法。它提供了一个层次结构,使用户能够轻松地访问他们的数据,并且支持对数据进行备份、恢复和保护。 Linux中有哪些常见的文件系统类型? 答…

使用 SpringBoot 访问 MySQL 数据库

一、目标 创建一个 MySQL 数据库,构建一个 Spring 应用程序,并将其连接到新创建的数据库。 二、准备工作 1、最喜欢的文本编辑器或 IDE 2、Java 17或更高版本 3、Gradle 7.5或Maven 3.5 三、初始化项目 1、 导航到https://start.spring.io。该服务…