一 网络的原理
1 客户端和服务端都是基于网路运行的。
2 互联网协议:就是计算机界的英语
3 五层协议:应用层,传输层,网络层,数据链路层,物理层这五层组成的
物理层:internet:发送和接收电信号(高低电频)
数据链路层:ethernet:一组电信号叫做数据帧,也叫数据报,数据报分为两个部分:报头(head)和数据(data)两部分。
head包含的有:发送者/源地址:6个字节
接收者/目标地址:6个字节
数据类型:6个字节
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标准的。