路飞学城Python-Day24(practise)

时间:2021-09-17 08:14:22

本章总结

练习题

  1. 什么是C/S架构?
C指的是client(客户端软件),S指的是Server(服务端软件)
路飞学城Python-Day24(practise)路飞学城Python-Day24(practise)

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

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

 
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),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束
路飞学城Python-Day24(practise)路飞学城Python-Day24(practise)

 
 
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开发规范,及专业的生产软件设计规范,包括目录、代码命名、功能接口等