一 网络的原理python
1 客户端和服务端都是基于网路运行的。编程
2 互联网协议:就是计算机界的英语设计模式
3 五层协议:应用层,传输层,网络层,数据链路层,物理层这五层组成的缓存
物理层:internet:发送和接收电信号(高低电频)服务器
数据链路层:ethernet:一组电信号叫作数据帧,也叫数据报,数据报分为两个部分:报头(head)和数据(data)两部分。网络
head包含的有:发送者/源地址:6个字节架构
接收者/目标地址:6个字节socket
数据类型:6个字节tcp
mac地址:每个网卡在生产的时候就会产生一个mac地址。函数
计算机的通讯就是靠吼,也叫广播包,只限于局域网的使用。世界上的全部网络都是有不少的局域网组成的。
网络层:ip地址:分为ipv4和ipv6.
每个IP地址都是有四个十进制数字组成
ip协议:规定了网络的地址协议叫作ip协议,它定义的地址也叫作ip地址。
子网地址:表示子网络特征的一个参数
网关地址:为了跨子网的通讯,能和外网之间进行通讯。
网关与网关之间的通讯就叫作路由协议。
mac地址:为了找到局域网络的位置。
ip地址:为了肯定子网的位置
ARP协议:将局域网内的mac地址转成网关地址。
mac地址和ip地址能找到世界上独一无二的一台机器。
传输层:tcp协议和udp协议,每启动一个软件对应者一个端口。
端口:肯定软件在计算机上面的位置。
ip地址加上端口:能够肯定世界上一台计算机上的一个软件的位置。
应用层:产生一个数据。
发数据是一层一层的封包;收数据是一层一层的解包。
tcp协议:首先发生连接的请求,创建好双向的连接,而后才能进行客户端和服务器端的传输,接收到数据之后回复肯定后丢掉原有的数据再关闭连接。称为可靠协议。
udp协议:不会创建链接,只有数据一发送出去,就会直接丢掉原有的数据。称为不可靠协议
二 socket模块
1 socket模块就是一个接口,也是套接字模块。
2 socket抽象层:就是一个编程接口。
客户端/服务器架构
即C/S架构
在互联网中到处都是C/S架构,就至关咱们是客户端,而服务端就是咱们想要在电脑上查询的内容。
为什么学习socket必定要先学习互联网协议:
1.首先:本节课程的目标就是教会你如何基于socket编程,来开发一款本身的C/S架构软件
2.其次:C/S架构的软件(软件属于应用层)是基于网络进行通讯的
3.而后:网络的核心即一堆协议,协议即标准,你想开发一款基于网络通讯的软件,就必须遵循这些标准。
4.最后:就让咱们从这些标准开始研究,开启咱们的socket编程之旅
socket层
3 socket模块的经常使用方法:
AF_UNIX:一台机器直接的通讯
AF_INET:基于网路的通讯
socket.socket():获取套接字对象。
listen:监听连接数量
accept:等待客户端连接。
connect:连接服务端
socket.SOCK_STREAM:tcp协议,也是一个数据流
send:发送消息
recv:接收消息
decode:解码
encode:编码
SO_REUSEADDR:重用ip和端口
服务器端:
import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.bind(('127.0.0.1',8091)) phone.listen(5) while True: conn,addr=phone.accept() while True: try: print(conn.recv(1024).decode('utf-8')) msg=input('>>>:') if not msg:continue conn.send(msg.encode('utf-8')) except Exception: break conn.close() phone.close()
客户端:
import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.connect(('127.0.0.1',8091)) while True: msg=input('>>>') phone.send(msg.encode('utf-8')) if not msg:continue print(phone.recv(1024).decode('utf-8')) phone.close()
服务端套接字函数 s.bind() 绑定(主机,端口号)到套接字 s.listen() 开始TCP监听 s.accept() 被动接受TCP客户的链接,(阻塞式)等待链接的到来 客户端套接字函数 s.connect() 主动初始化TCP服务器链接 s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常 公共用途的套接字函数 s.recv() 接收TCP数据 s.send() 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完) s.sendall() 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完) s.recvfrom() 接收UDP数据 s.sendto() 发送UDP数据 s.getpeername() 链接到当前套接字的远端的地址 s.getsockname() 当前套接字的地址 s.getsockopt() 返回指定套接字的参数 s.setsockopt() 设置指定套接字的参数 s.close() 关闭套接字 面向锁的套接字方法 s.setblocking() 设置套接字的阻塞与非阻塞模式 s.settimeout() 设置阻塞套接字操做的超时时间 s.gettimeout() 获得阻塞套接字操做的超时时间 面向文件的套接字的函数 s.fileno() 套接字的文件描述符 s.makefile() 建立一个与该套接字相关的文件
socket是什么
Socket是应用层与TCP/IP协议族通讯的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在
Socket接口后面,对用户来讲,一组简单的接口就是所有,让Socket去组织数据,以符合指定的协议。
因此,咱们无需深刻理解tcp/udp协议,socket已经为咱们封装好了,咱们只须要遵循socket的规定去编程,写出的程序天然就是遵循tcp/udp标准的。