本章总结

练习题

  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. 设置Pycharm在创建py文件时自动添加文件头注释(类似于钩子特性)

    在每次新建一个py文件的时候 1 如何自动添加 #!/usr/bin/env python2 自动添加       #-*- coding: utf-8 -*- 操作方法: File -> se ...

  2. DNS解析流程原理(图例)

    13台根服务器的dns: 1.root-servers.net198.41.0.4美国2.root-servers.net192.228.79.201美国(另支持IPv6)3.root-servers ...

  3. phthon中的open函数模式

    原文地址:http://www.runoob.com/python/python-func-open.html r 以只读方式打开文件.文件的指针将会放在文件的开头.这是默认模式. rb 以二进制格式 ...

  4. 20190226-SecureCRT连接linux显示中文乱码

    SecureCRT连接我的Ubuntu14时中文显示乱码 解决办法: 在session options里选择UTF-8

  5. 邓_ Mysql·笔记

    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司.MySQL是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relation ...

  6. 【ACM-ICPC 2018 南京赛区网络预赛 E】AC Challenge

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 写个DP 设f[j]表示已经做的题的状态为j的情况下接着选能获得的最大分数. 显然是个倒推. 记忆化搜索一波 dfs(i,j) 表示 ...

  7. 关于struts值栈的总结,前端页面如何使用标签取得值栈中的数据

    用户提交一次请求的执行过程 总结: struts值栈中 两个内容 一个是栈 一个是map 值栈(数据中心)的范围是一个请求 它代替了request作用域 struts自定义标签有一个特点 比如遍历集合 ...

  8. BA-siemens-TX-IO模块照片

    西门子楼宇自控用到的P1模块是这样的 TX-16D模块是这样的 TX-8X模块是这样的: TX-6R模块是这样的: TX-IO总线连接模块( 此模块供电和通讯加起来共需三芯线):

  9. jquery源码ajax分析

    http://www.cnblogs.com/aaronjs/p/3683925.html

  10. dnscat使用——整体感觉这个工具不完善,失败率很高,传文件时候没有完整性校验,我自己测试时通过域名转发失败,可能是其特征过于明显导致

    git clone https://github.com/iagox86/nbtool make 然后就可以按照下面的官方说明进行操作了. 我的感受:整体感觉这个工具不完善,失败率很高,传文件时候没有 ...