TPC 网络通信基础(二)

news/2024/9/15 21:20:00/

文件下载利用 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。该服务…

HTTPTomcatServlet学习

HTTP&Tomcat 今日目标: 了解JavaWeb开发的技术栈理解HTTP协议和HTTP请求与响应数据的格式掌握Tomcat的使用掌握在IDEA中使用Tomcat插件理解Servlet的执行流程和生命周期掌握Servlet的使用和相关配置 1. Web概述 1.1 Web和JavaWeb的概念 Web是全球广域网&…

freeswitch的2833和inband对接方案

概述 freeswitch支持三种模式的DTMF传输方式,分别时inband、INFO、2833。 在传统的PSTN网络中,所有的DTMF码都是inband模式,所以VOIP网络和PSTN网络对接中,需要将DTMF码做格式转换,通常是2833和inband之间的转换。 …

Makefile 简易教程

如果你是命令行重度使用者,学习 Makefile 将可以大大提高你的开发效率,下面简单介绍一下 Makefile 的知识和使用方式。 Makefile 是一种包含一组指令来编译和构建软件项目的文件。 Makefile 文件通常包含一组规则和依赖关系,以指定如何将源…

Netty核心组件模块(一)

1.Bootstrap和ServerBootstrap 1>.Bootstrap意思是引导,一个Netty应用通常由一个Bootstrap开始,主要作用是配置整个Netty程序,串联各个组件,Netty中Bootstrap类是客户端程序的启动引导类,ServerBootstrap是服务端启动引导类; 2>.常见的方法有: ①.public ServerBootstr…

【笔试强训选择题】Day13.习题(错题)解析

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!! 文章目录…

spring项目里的大事务优化

编程型事务更加灵活 声明式事务只需要加在方法头加Transactional注解即可开启事务,但是还是不太灵活,意味着整个方法所进行对数据库操作都要加进事务,当然一次查询也要进入事务,这并不是我们想要的,我们在update、ins…

SpringMVC 执行流程

视图阶段(老旧JSP等) DispatcherServlet:接收请求、响应结果,所有的请求都要经过它,它是被Tomcat容器初始化的当这个类加载时会加载一些组件类HandlerMapping、HandlerAdapter、ViewResolver等等。 HandlerMapping:根…

mybatis-plus 自动填充的时间跟真实时间相差8小时

项目中 用到了以下两个字段,分别是插入数据时间和更新数据时间,用的mybatis-plus自动填充,结果发现填充的时间跟真实时间相差很多。查了一些资料,找到了解决方案: 1. 下图是我的mysql没有进行配置之前的时区配置,这里的CST包括了4个时区,分别…

泛型类和泛型类是并列的关系

package com.test.test05;import java.util.ArrayList;class Demo{public static void main(String[] args) {Object obj new Object();String s new String();obj s; //多态的一种形式Object[] objArr new Object[10];Object[] strArr new String[10];objArr st…

一种基于非均匀分簇和建立簇间路由的算法的无线传感器网络路由协议(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 本文准备了一种路由方法,该方法使传感器通过有效地使用能量将数据从发送方加载到接收器,因为它在 LEAC…

修为 - 人生感悟

人不为己,天诛地灭。 说明一下,上面说的为己,指的是人的修为。 一个人,在成年之后,需要不断的对自己进行修为的提高。在经历了世事之后,对人生的感悟要不断地进行总结,提高自己的修为。 老祖宗给…

基于ArcGIS实现陕西省1:250000比例尺地形图分幅和编号

1地形图的分幅与编号原理 我国1:1000000地形图的分幅采用国际1:1000000地图分幅标准,而其他比例尺地形图分幅以1:1000000比例尺地形图为基准进行分幅。每幅1:1000000地形图范围是经差6、纬差4;纬度60~ 76之间经差12、纬差4;纬度76~ 88之间经…