内容回顾
- 网络概念
- 网络架构
- C/S client - server
- B/S brower-server
- web服务
- B/S 是特殊的C/S
- 物理设备
- 网卡 mac地址 全球唯一的物理地址
- 交换机 完成局域网内的多台机器之间的通信
- 单播 组播 广播
- 只能识别mac地址
- arp协议(地址解析协议):通过IP地址获取mac地址
- 由交换机完成的
- 广播 单播
- 路由器 完成局域网与局域网之间的联系
- 能识别IP地址
- 网段
- 网关ip
- 访问局域网外部服务的一个出口ip
- ip地址在网络上定位一台机器
- ipv4
- ipv6
- port能够在网络上定位一台机器上的一个服务
- 0-65535
今日内容
概念
-
TCP协议 ---- 打电话
-
协议的特点:可靠、慢 全双工通信
-
建立连接的时候:三次握手
-
断开连接的时候:四次挥手
-
在建立其连接之后,发送的每一条信息都有回执,为了保证数据的完整性,还有重传机制
-
长连接:会一直占用双方的端口
-
能够传递的数据的长度是没有限制的
-
IO(input,output)操作,输入和输出是相对内存来说的
- write send - output
- read recv - input
-
-
UDP协议 --- 发短信
- 协议的特点:无连接的 速度快
- 可能会丢消息
- 能够传递的数据的长度是有限的,是根据数据传递设备的设置有关系
-
应用场景
- TCP 文件的上传下载(发送邮件、网盘、缓存电影)
- UDP 即时通讯类的(qq、微信、飞秋)
-
OSI七层模型
- 应用层
- 表示层
- 会话层
- 传输层
- 网络层
- 数据链路层
- 物理层
每一层的物理设备,每一层的常见协议
-
OSI五层协议 协议 物理设备
-
应用层 http https ftp smtp
python代码 hello
-
传输层 tcp /udp协议 端口 四层路由器 四层交换机
-
网络层 ipv4/ipv6协议 三层路由器 三层交换机
-
数据链路层 mac地址 arp协议 网卡、交换机 二层交换机
-
物理层
-
代码部分
-
介绍socket(套接字)
-
python中借助socket模块,完成soket功能
-
工作在应用层和传输层之间的抽象层,帮助我们完成了所有信息的组织和拼接
-
sokcet对于程序员来说 已经是网络操作的底层了
-
socket历史
- 同一台机器上的两个服务之间的通信的
- 基于文件
- 基于网络的多台机器之间的多个服务通信
- 同一台机器上的两个服务之间的通信的
-
-
使用socket完成tcp协议的web通信
-
练习
##server.py import socket sk = socket.socket() sk.bind((\'127.0.0.1\',9000)) sk.listen() #n print(\'*\'*20) conn,addr = sk.accept() #阻塞 while True: msg = conn.recv(1024) print(msg.decode(\'utf-8\')) inp = input(\'>>>>\') conn.send(inp.encode(\'utf-8\')) conn.close() sk.close() ##client.py import socket sk = socket.socket() sk.connect((\'127.0.0.1\',9000)) while True: inp = input(\'>>>\') sk.send(inp.encode(\'utf-8\')) msg = sk.recv(1024) print(msg.decode(\'utf-8\')) sk.close()###server.py import socket sk = socket.socket() sk.bind((\'127.0.0.1\',9000)) sk.listen() #n 允许多少客户端等待 print(\'*\'*20) while True: #outer conn,addr = sk.accept() #阻塞 while True: #inner msg = conn.recv(1024).decode(\'utf-8\') if msg == b\'Q\': break print(msg) inp = input(\'>>>>\') conn.send(inp.encode(\'utf-8\')) if inp.upper() == \'Q\': break conn.close() sk.close() #想说啥说啥 input #想说多久说多久 while True: #inner #和一个人聊完再和另一个人聊 while True: #outer ###client.py import socket sk = socket.socket() sk.connect((\'127.0.0.1\',9000)) while True: inp = input(\'>>>\') if inp.upper() == \'Q\': break sk.send(inp.encode(\'utf-8\')) msg = sk.recv(1024).decode(\'utf-8\') if msg == b\'Q\':break print(msg) sk.close()
-
-
使用socket完成udp协议的web通信
###server.py import socket sk = socket.socket(type=socket.SOCK_DGRAM) sk.bind((\'127.0.0.1\',9000)) while True: msg,client_addr = sk.recvfrom(1024) print(msg.decode(\'utf-8\')) inp = input(\'>>>\').encode(\'utf-8\') sk.sendto(inp,client_addr) sk.close() ###client.py import socket sk = socket.socket(type=socket.SOCK_DGRAM) while True: inp = input(\'>>>\').encode(\'utf-8\') sk.sendto(inp,(\'127.0.0.1\',9000)) ret = sk.recv(1024) print(ret.decode(\'utf-8\')) sk.close()
作业
1.基于TCP协议实现聊天需求
#基础需求:
#1.server和client段连接之后,能直到对面这个人是哪一个好友
#2.不同好友的聊天颜色不同 https://www.cnblogs.com/Eva-J/articles/8330517.html
#进阶需求:
#多个人能同时互相聊
2.基于UDP协议实现聊天需求
#基础需求:
#能随时退出
#能实现一个人和多个人聊天
#并且给每个人表示一个身份
#每个身份一种颜色
#进阶需求:
#多个人能同时互相聊
3.基于TCP协议实现用户登录
#基础:只能实现基础登录即可
#进阶:加入hashlib密文存储密码
#密文摘要 在server端还是client端
4.基于TCP协议完成文件上传
#基础的需求:两台机器能从一台发送给另一台
#进阶的需求:考虑大文件