网络编程
基于同一台机器上的多个程序之间通信,可以基于文件
基于多台机器上的多个程序之间通信,可以基于网络
我们平时使用的网络(web程序)是由两种架构完成的
C/S 架构:client 客户端 server 服务端
B/S 架构:browser 浏览器 server 服务端
C/S架构特点
所有的都需要安装一下
windows系统中为 .exe 文件 是一个客户端
例如 QQ 百度网盘 爱奇艺
一个S端对应多个C端
安装一个客户端,然后这个客户端就可以和服务端进行网络交互
B/S架构特点
所有能用网页访问的网站,这个网站就是B/S架构的
例如 京东 4399 这种能用到浏览器直接访问的
如果一个网站可以被网页访问,这个网站就是B/S架构
B/S架构和C/S架构的关系
所有的B/S架构都需要一个浏览器才能访问
浏览器是一个软件,相当于一个客户端
所有的B/S架构也都是C/S架构的
浏览器(browser)也是特殊的客户端(client)
这两种架构哪一种好
C/S架构 装好之后直接双击就可以使用了 更灵活 可以右键点击
B/S架构 极大的简化了我们使用软件的成本 更符合现在的使用理念,但还有很多功能没有实现
B/S架构 在PC端统一了程序的入口 在手机端没那么适合使用浏览器,更喜欢统一入口的软件
网卡
是独一无二不重复的
mac地址
网卡上有一个内容 就是mac地址
唯一的标识了一台机器
mac地址 传输的内容 接收人的mac地址
是十二位的十六进制数
多台机器之间的通信
交换机给所有的机器都发送一条信息(带着这台机器的ip地址)
如果机器的ip和交换机发送信息的ip不同,就丢弃这条信息
ip和发送的信息相同,返回自己的mac地址
交换机不认识ip地址
假设 ip地址位 192.168.16.3
先把ip地址转为二进制
交换机先读32位 找到是谁发给我的ip
又读32位,找到了是发给我的
地址解析协议(arp协议)
由交换机完成的
通过ip地址找到一台机器的mac地址
使用到了交换机的广播(指向所有机器)和单播(指向一个机器)的功能(还有一个组播功能,但arp协议里没有用到)
ipv4协议 32位的二进制组成4位点分十进制
0.0.0.0 -- 255.255.255.255
ipv6协议 由6位冒分16进制组成的
0:0:0:0:0:0 -- FFFFFF:FFFFFF:FFFFFF:FFFFFF:FFFFFF:FFFFFF
所有的机器连在一个交换机上 交换机通过广播找一台机器 很麻烦
可以分区域
路由器
是用来连接交换机的
路由器的接口叫网关 有的网站会封ip地址,其实封的是网关
局域网
连在同一个交换机上的机器叫做局域网内的机器
局域网之间的通信由路由器完成
路由器提供给局域网一个统一的网关ip 通过网关ip访问其他网络
如果局域网太多,一个路由器连接不下,路由器还可以连接路由器
有ip为什么还要mac
mac地址是这台机器的唯一标识
端口
ip地址+mac地址确定机器
端口确定这台机器上的具体应用
端口共有65535个 0-65535
常用8000之后的端口
子网掩码
把ip地址和子网掩码分别转成二进制
然后 分别按位置对比
1&1 = 1 1&0 ,0&0 ,0&1 = 0
最后转回二进制,如果相同,两个ip地址就是同一网段
ip的保留字段
ipv4的地址是有限的
0.0.0.0 - 255.255.255.255
想用哪个ip,需要申请,只能用国内分到的ip地址,用国外的是无效的
这些网段是没有分配的,是完全不对外提供服务的网址
10.0.0.0 - 10.255.255.255
172.16.0.0 - 172.31.255.255
192.168.0.0 - 192.168.255.255
这些字段是有可能在各个公司的内网被重复使用的,而不会对外真正提供服务的
127.0.0.1 本地的回环地址
总是找当前自己的机器,不通过交换机
别的人找不到你 只有自己这台机器能找到你自己
0.0.0.0 全网段地址
打到这台机器上的服务,都认为是可以接收进来的
socket模块
套接字
所有的网络通信的底层都是基于socket做的
通信分为server文件和client文件
server文件
import socket sk = socket.socket()#创建一个socket对象 sk.bind(('127.0.0.1',9123))#绑定一个服务端的地址,bind里面的是元组,元组里最后一项需要满足是int类型,8000之后,65535之前 sk.listen()#开始接受客户端给我的连接 conn,addr = sk.accept()#阻塞,直到有人连我,conn代表我和他之间的连接,addr代表他的IP地址 conn.send(b'hello')#给他发消息,必须是bytes类型 msg = conn.recv(1024)#从他处接受信息,里面写1024代表接受1024字节个消息,不足1024个全部接收,超过只接收1024个字节 print(msg.decode('utf-8'))#打印消息 conn.close()#'挂电话' sk.close()#'关机'
client文件
import socket sk = socket.socket() sk.connect(('127.0.0.1',9123)) msg = sk.recv(1024)#server是先发再收,所以client是先收再发 print(msg) sk.send(b'wahaha') sk.close()