进程
1.软件架构
- c/s架构
- client客户端
- server服务端
- 优点:软件的使用稳定,可以节省网络资源
- 缺点:若用户想在同一个设备上使用多个软件,必须下载多个客户端。软件的每一次更新,客户端也必须跟着更新
- c/s架构的软件
QQ,Pycharm
- b/s架构
- browser:浏览器
- server:服务器
- 优点:以浏览器充当客户端,无需用户下载多个软件,也无需用户下载更新软件版本。用户以浏览器充当客户端,直接在浏览器访问需要使用的软件。
- 缺点:消耗网络资源过大,当网络不稳定的时候,网络的使用也不稳定。
2.网络编程
-
实现远程通信必须具备:
- 物理连接介质:网卡
- 互联网协议
- 计算机之间沟通的介质:互联网协议
-
互联网协议:
-
互联网协议又称为网络七层协议,OSI七层协议,OSI是一个世界标准组织
-
物理连接层
- 基于电信号发送二级制的数据01001001001010010
-
数据链路层
-
数据链路层的以太网协议,专门用于处理基于电信号的二级制数据
-
以太网协议:
- 规定好电信号的数据分组方式
- 每一台连接网线的电脑必须要有一块网卡
- 网卡由不同的厂商生成的
- 每块网卡都会有世界上独一无二的12位编号
- 前6位:厂商号
- 后6位:流水号
- 每块网卡都会有世界上独一无二的12位编号
- 网卡由不同的厂商生成的
-
交换机:可以让多台电脑连接到一起。
-
基于以太网协议发送数据
特点:
广播,单播
弊端:
广播风暴,不能跨局域网通信
-
互联网
- 让局域网之间可以通信。
-
-
网络层
- IP地址:用于唯一标识计算机的地址
- IP:点分十进制
- 最小值:0.0.0.0
- 最大值255.255.255.255
-
传输层
-
TCP/UDP协议,他们都是基于端口工作的
-
端口号:标识电脑上某一个软件。
-
端口范围:0~65535
-
注意
- 操作系统中0~1024都被默认使用了。
- 尽量使用8000之后的端口号
-
常用软件的默认端口号
- mysql:3306
- mongodb:27017
- Django:8000
- tomcat:8080
- Flask:5000
- Redis:6379
-
若想服务端与客户端进行通信,必须要建立连接,产生两条管道。
- 一条是客户端往服务端发送消息的
- 另一条是服务端往客户端发送消息的
-
TCP协议工作原理
- 三次握手,四次握手
- 三次握手建立连接
- 建立双向通道,建立好连接
- listen:监听
- established:确认请求建立连接
- 发送数据:
- wrtie
- read
- 客户端往服务端发送数据,数据存放在内存中,需要服务端确认收到,数据才会在内存中释放。否则会隔一时间发送一次,让服务端返回确认收到。在一段时间内,若服务端不返回确认收到,则取消发送。并释放内存数据
- 建立双向通道,建立好连接
- 四次握手断连接
- TIME_WAIT:时间等待
- 三次握手建立连接
- 三次握手,四次握手
-
-
-
应用层
- 应用层协议http,ftp
-
-
-
总结:
- IP:用于唯一标识某一台计算机的位置
- port:端口用于确认计算机上的一个应用软件
- IP+PORT:世界上某台电脑的软件
3.socket编程
- 什么是socket:
- socket是一个模块,可以写一套c/s架构的套接字
- 为什么要使用socket
- socket套接字会封装好各层协议的工作
- 好处:可以节省开发成本
- 如何使用socket
#服务端
# -*-coding:utf-8-*-
# Author: yqliu
# CreatDate: 2019/10/17 14:37
import socket
#默认指定TCP协议
#买了手机
server=socket.socket()
#插卡
server.bind(
#ip+port
('127.0.0.1',9527)
)
#开机
server.listen(5)#半连接池
print ('服务端启动。。。。。。。。。。。')
#监听是否有消息
#conn相当于服务端往客户端挖的管道
#
conn,addr=server.accept()
print (addr)
#听客户端给我说话
data=conn.recv(1024)#1024可接收1024字节数据
print (data)
conn.send(b'hello client')
#挂掉电话
conn.close()
#关机
server.close()
***********************************************
#客户端
# -*-coding:utf-8-*-
# Author: yqliu
# CreatDate: 2019/10/17 14:37
import socket
print ('客户端开始启动。。。。。。')
#买手机
client=socket.socket()
#往服务器拨号
#client相当于客户端往服务端挖了管道
client.connect(
('127.0.0.1',9527)
)
#客户端发送向服务端说话
client.send(b'hello server')
data=client.recv(1024)
print (data)
#向服务端发送断开连接的请求
client.close()
#注意点,客户端与服务端必须遵循:
#一端send另一端recv,不能同时send或者recv