本章总结

练习题

  1. 什么是C/S架构?
C指的是client(客户端软件),S指的是Server(服务端软件)

2.互联网协议是什么?分别介绍五层协议中每一层的功能?
互联网协议就时计算机与计算机之间通讯遵循的标准,
TCP/IP五层协议:
1.物理层:提供计算机互通的物理介质, 基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0
2.数据链路层:定义电信号的分组方式,使用以太网协议封装数据格式(数据报头(18个字节双方地址+数据类型)+数据)
3.网络层: 引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址(IPV4/IPV6)
4.传输层: 建立端口到端口的通信(应用软件使用的端口号)
5.应用层:软件实现各种功能

 
 
3.基于tcp协议通信,为何建立链接需要三次握手,而断开链接却需要四次挥手
三次握手:1.客户端对服务端发送同步请求(建立连接通道);2.服务端响应后,发送同步请求(建立连接通道)和发送确认数据(这里的两个请求被合并成一个了);3.客户端向服务端发送确认数据
四次挥手:1.客户端发送端口结束包给服务端,2.服务端收到以后返回确认信息给客户端;3.服务端发送端口结束包给客户端;4.客户端确认信息返回给服务端
区别:四次挥手的过程中,服务端返回给客户端的确认信息之后不会立刻关闭,有可能会继续给客户端发送数据,所以必须得有四次挥手

 
4.为何基于tcp协议的通信比基于udp协议的通信更可靠?
TCP:tcp的协议可靠是因为每次发送数据的时候都会发送确认信息,如果未收到确认信息就会再发送一次,所以信息不容易丢失
UDP:不具有确认信息回复的功能,直接发送数据,如果数据丢失不会再重复发送

5‍.流式协议指的是什么协议,数据报协议指的是什么协议?
流式协议:TCP协议,数据可靠,消耗较多资源
数据报协议:UDP协议 数据不可靠,消耗较少资源

6.什么是socket?简述基于tcp协议的套接字通信流程
socket套接字
 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议
套接字的工作流程
先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束

 
 
7.什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?
粘包
多个包的数据粘到一起了,在管道里根本不区分数据,流式数据传输的特性,所有数据全部传到一起不做任何区分
粘包的原因
粘包发生的原因:数据量比较小,而且发送时间短
发生粘包的情况
接收端不知道发送端的具体发送数据大小,导致发送端只发送了数据包给接收端

 
 
 
8.基于socket开发一个聊天程序,实现两端互相发送和接收消息
服务端
import socket
 
 
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.0.0.1', 8080))
server.listen(5)
conn, addr = server.accept()
while True:
res = conn.recv(1024)
print('收到的消息%s'%res)
msg = input('请发送回复消息').strip()
conn.send(msg.encode('gbk'))
conn.close()
server.close()
 
客户端
import socket
 
 
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1' ,8080))
while True:
msg = input('请输入发送的信息').strip()
client.send(msg.encode('gbk'))
res = client.recv(1024)
print('接收的信息%s'%res)
client.close()
 

9.基于tcp socket,开发简单的远程命令执行程序,允许用户执行命令,并返回结果
服务端
import socket
import subprocess
import struct
import json
 
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.0.0.1', 8080))
server.listen(5)
while True:
conn, addr = server.accept()
while True:
try:
res = conn.recv(8096)
obj = subprocess.Popen(res.decode('gbk'), shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
 
stdout = obj.stdout.read()
stderr = obj.stderr.read()
header_dic = {
'filename': 'a.txt',
'md5': 'xxdxxx',
'total_size': len(stdout) + len(stderr)
}
header_json = json.dumps(header_dic)
header_bytes = header_json.encode('gbk')
conn.send(struct.pack('i', len(header_bytes)))
conn.send(header_bytes)
conn.send(stdout)
conn.send(stderr)
except ConnectionResetError:
break
conn.close()
server.close()
 
客户端
 
import socket
import struct
import json
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 
phone.connect(('127.0.0.1', 8080))
while True:
#1、发命令
cmd=input('>>: ').strip() #ls /etc
if not cmd:continue
phone.send(cmd.encode('gbk'))
 
#2、拿命令的结果,并打印
 
#第一步:先收报头的长度
obj=phone.recv(4)
header_size=struct.unpack('i',obj)[0]
 
#第二步:再收报头
header_bytes=phone.recv(header_size)
 
#第三步:从报头中解析出对真实数据的描述信息
header_json=header_bytes.decode('gbk')
header_dic=json.loads(header_json)
print(header_dic)
total_size=header_dic['total_size']
 
#第四步:接收真实的数据
recv_size=0
recv_data=b''
while recv_size < total_size:
res=phone.recv(1024) #1024是一个坑
recv_data+=res
recv_size+=len(res)
 
print(recv_data.decode('gbk'))
 
phone.close()
 
 

10.基于tcp协议编写简单FTP程序,实现上传、下载文件功能,并解决粘包问题
11.基于udp协议编写程序,实现功能
1.执行指定的命令,让客户端可以查看服务端的时间
2.执行指定的命令,让客户端可以与服务的的时间同步

作业

题目:开发一个支持多用户同时在线的FTP程序
要求:
  1. 用户加密认证
  2. 允许同时多用户登录(用到并发编程的知识,选做)
  3. 每个用户有自己的家目录,且只能访问自己的家目录
  4. 对用户进行磁盘配额,每个用户的可用空间不同(选做)
  5. 允许用户在ftp server上随意切换目录
  6. 允许用户查看当前目录下的文件
  7. 允许上传和下载文件,并保证文件的一致性
  8. 文件传输过程中显示进度条
  9. 附加:支持文件的断点续传(选做)
  10. 开发的程序需符合PEP8开发规范,及专业的生产软件设计规范,包括目录、代码命名、功能接口等
 

路飞学城Python-Day24(practise)的更多相关文章

  1. 路飞学城—Python爬虫实战密训班 第三章

    路飞学城—Python爬虫实战密训班 第三章 一.scrapy-redis插件实现简单分布式爬虫 scrapy-redis插件用于将scrapy和redis结合实现简单分布式爬虫: - 定义调度器 - ...

  2. 路飞学城—Python爬虫实战密训班 第二章

    路飞学城—Python爬虫实战密训班 第二章 一.Selenium基础 Selenium是一个第三方模块,可以完全模拟用户在浏览器上操作(相当于在浏览器上点点点). 1.安装 - pip instal ...

  3. 路飞学城Python爬虫课第一章笔记

    前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 之前看阮一峰的博客文章,介绍到路飞学城爬虫课程限免,看了眼内容还不错,就兴冲冲报了名,99块钱满足以下条件会返还并送书送视频. 缴 ...

  4. 路飞学城-Python开发集训-第3章

    学习心得: 通过这一章的作业,使我对正则表达式的使用直接提升了一个level,虽然作业完成的不怎么样,重复代码有点多,但是收获还是非常大的,有点找到写代码的感觉了,遗憾的是,这次作业交过,这次集训就结 ...

  5. 路飞学城-Python开发集训-第1章

    学习体会: 在参加这次集训之前我自己学过一段时间的Python,看过老男孩的免费视频,自我感觉还行,老师写的代码基本上都能看懂,但是实际呢?....今天是集训第一次交作业的时间,突然发现看似简单升级需 ...

  6. 路飞学城-Python开发集训-第4章

    学习心得: 学习笔记: 在python中一个py文件就是一个模块 模块好处: 1.提高可维护性 2.可重用 3.避免函数名和变量名冲突 模块分为三种: 1.内置标准模块(标准库),查看所有自带和第三方 ...

  7. 路飞学城-Python开发集训-第2章

    学习心得: 这章对编码的讲解超级赞,现在对于编码终于有一点认知了,但还没有大彻大悟,还需要更加细心的琢磨一下Alex博客和视频,以前真的是被编码折磨死了,因为编码的问题而浪费的时间很多很多,现在终于感 ...

  8. 路飞学城Python-Day19(practise)

    # 特性1.继承:2.多态:3.封装 # 1.继承的用处:通过继承就可以解决类与类之间的代码冗余关系 # 2.多态的用处:1.增加了程序的灵活性,以不变应万变,使用者都是同一种形式去调用(func(a ...

  9. 路飞学城-Python开发-第二章

    ''' 数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家' ...

  10. 路飞学城-Python开发-第三章

    # 数据结构: # goods = [ # {"name": "电脑", "price": 1999}, # {"name&quo ...

随机推荐

  1. linux 性能分析与优化

    一.影响Linux服务器性能的因素 1.操作系统级 (CPU 内存 磁盘I/O性能 网络带宽) 2.程序应用级 二.系统性能评估标准   好  坏 极差 cpu user% +sys% <70% ...

  2. 怎么让composer加速(转)

    composer 在install的时候会做这几个事情: 去packagist.org中寻找对应需要的包的版本信息和下载地址 循环下载对应的包 解压安装对应的包 我们平时使用composer慢就可能在 ...

  3. 序列模型(4)----门控循环单元(GRU)

    一.GRU 其中, rt表示重置门,zt表示更新门. 重置门决定是否将之前的状态忘记.(作用相当于合并了 LSTM 中的遗忘门和传入门) 当rt趋于0的时候,前一个时刻的状态信息ht−1会被忘掉,隐藏 ...

  4. Vue学习之路第十九篇:按键修饰符的使用

    1.我们工作中经常会有类似于这样的需求:按下Enter键触发某个事件.或者按下ESC退出页面等各种各样的场景.在Vue中,可以通过键盘修饰符来实现这样的场景. 2.事例代码: <body> ...

  5. hibernate在maven中自动生成

    1.构建数据库连接 2.新建maven项目,利用工具生成hibernate相应的类和xml文件 新建pojo包 右击项目 点击Configure Facets 选择hibernate 选择包 选择驱动 ...

  6. Python中的全局变量与局部变量的区别

    全局变量与局部变量两者的本质区别就是在于作用域 用通俗的话来理解的话, 全局变量是在整个py文件中声明,全局范围内都可以访问 局部变量是在某个函数中声明的,只能在该函数中调用它,如果试图在超出范围的地 ...

  7. Oracle学习总结(6)—— SQL注入技术

    不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动.在网络中,数据库驱动的Web应用随处可见,由此而存在的SQL注入是影响企业运营且最具破坏性的漏洞之一. SQL注入基 ...

  8. redis helloworld

    一.启动 redis 服务 [root@MyLinux bin]# ./redis-server redis.conf 二.使用客户端连接服务 [root@MyLinux bin]# ./redis- ...

  9. mybatis入门截图总结

    原生态jdbc存在的问题 ------------------- ----------------------- ------- 环境的搭建 ----------------------------- ...

  10. nmon分析文件各sheet含义

    sheet名称sheet含义 SYS_SUMM系统汇总,蓝线为cpu占有率变化情况,粉线为磁盘IO的变化情况: AAA关于操作系统以及nmon本身的一些信息: BBBB系统外挂存储容量以及存储类型: ...