网络通信:使用自己的电脑和别人的电脑进行练习并发送消息或者文件等操作。socket就是网络通信的工具。
1、
C/S架构:客户端(client)/服务端(server)架构
客户端:指与服务器相应,为客户提供本地服务的程序。
服务端:广义:指网络中能对其他机器提供某些服务的计算机系统。
B/S架构:浏览器(browser)/服务端(server)
软件C\S架构:浏览器,QQ、,微信,
硬件C\S架构:打印机
2、网络通信的整个流程
①流程图
流程描述:
第一步:打开浏览器,想要请求访问京东,在地址栏输入网址:www.jd.com.(www.jd.com是域名,就是一个IP 地址的名称,IP地址不好记,所以就有了域名
第二步:先将请求信息发给交换机,然后交给了路由器,路由发给DNS服务器,通过DNS协议去找我们要访问的京东的IP地址:
第三步:查到的京东服务器对应的IP地址之后,路由器通过路由协议找到路由转发的最优路径,将你的请求信息还送给这个IP地址的京东的路由器
第四步:京东的路由器发给了京东网站的服务器上
第五步:当你打开浏览器的时候,你的电脑给你的浏览器这个运行起来的程序给了一个编号,叫做端口号,当你的电脑收到京东发过来的消息的时候,你的电鸟通过端口号找到你的浏览器,你的浏览器拿到了京东的网站信息,然后页面会显示京东的网站信息
② 内部组件的信息
集线器(HUB):将所有的电脑联通起来,属于数据通信系统中的基础设备
交换机:交换式的集线器,多台机器之间的网络通信。工作方式分为单播,组播,广播
单播:客户端与服务器之间的点到点连接,将信息发送给对应的一个机器。
广播:将要找的机器的信息发给局域网内的所有的机器
网卡:接受处理电信号,电脑插网线的地方叫做网卡,网卡提供了网络的接口
MAC地址(物理地址):1C-1B-0D-74-43-9A ,长度为48为2进制,通常由12为16进制数表示( 前三位厂商编号,后三位生产流水号),全球唯一的,也就是网络设备的身份证号,但是不能用MAC地址来找寻机器。
IP地址:由4个点分十进制组成,由点分割的四个十进制的数,在计算机中则由二进制组成,如下
ipv4 它可以设置成静态的,也可以自动获取
server01.py
client01.py
talk_server.py
talk_client.py
二进制:00000000.00000000.00000000.00000000 - 11111111.11111111.11111111.11111111, 十进制:0.0.0.0 - 255.255.255.255
ipv6
0.0.0.0.0.0 - 255.255.255.255.255.255
127.0.0.1 是回送地址,指本地机,一般用来测试使用,主要用于网络软件测试一级本地机进程间通信。无论什么程序,一旦使用会送地址发送数据,协议软件立即返回,不进行任何网络传输(来自百度百科)
IP地址段:192.168.12.0 - 192.168.12.255 同一IP地址段,称为同一子网,以广播的形式通信。
子网掩码: 表示子网络特征的一个参数,255.255.255.0。判断任意两个IP地址是否处在同一子网络。方法时将两个IP地址域子网掩码分别进行and运算(两个数位都为1,运算结果为1,否则为0)。然后比较结果是否相同,如果是的话就标名他们在同一个自网络,否则就不是。
比如:已知IP地址172.16.10.1和172.16.10.2的子网掩码都是255.255.255.0,请问它们是否在同一个子网络?两者与子网掩码分别进行AND运算,
172.16.10.1:10101100.00010000.00001010.000000001 255255.255.255.0:11111111.11111111.11111111.00000000 AND运算得网络地址结果:10101100.00010000.00001010.000000001->172.16.10.0 172.16.10.2:10101100.00010000.00001010.000000010 255.255.255.0:11111111.11111111.11111111.00000000 AND运算得网络地址结果:10101100.00010000.00001010.000000001->172.16.10.0 结果都是172.16.10.0,因此它们在同一个子网络。
IP地址域子网掩码按位 与 得到网段地址
255.255.255.0
192.168.13.253
11111111.11111111.11111111.00000000 11000000.10101000.00001101.11111101 11000000.10101000.00001101.00000000 # 局域网网段 192.168.13.0 # 这样求出了一个网段地址
DHCP协议:自动获取IP地址 Arp协议:广播的方式发送数据包,通过IP地址获取目标主机mac地址,IP地址不固定,mac是全球唯一的DNS:域名解析 域名:www.jd.com DNS服务端:{'www.jd.com':173.1.49.0} NAT转换:网络地址转换 路由器:转发消息,管理内网 路由协议:计算转发消息的最优路径 端口:标识某个应用程序 端口映射:0-65535 找到提供服务的程序 IP地址+端口:能够唯一锁定一台电脑和这个电脑上的某个应用程序 网关:把关用的,所有对外的请求,都要经过网关 NAT技术:网络地址转换,内网IP地址转换位公网或者说外网的IP地址
广播风暴:广播数据充斥网络无法处理,并占用大量网络带宽,导致正常业务不能运行。(以前通过mac地址就可以通信,mac地址通信时广播的形式,当所有的电脑都通过这种形式通信,就会西港城广播风暴,会阻塞网络,信息也变得很不安全,因为所有人都可以收到你打的信息。
为了避免广播风暴:分了多个局域网,然后通过路由器连起来
内网和外网
内网:内网就是局域网,局域网就是固定在一个地理区域内由两台以上的电脑用网线和其他网络设备搭建而成的一个封闭的计算机组。可以是邻居之间的2台电脑,也可以是一张大楼内的所有电脑。局域网可以是独立封闭运行的,也可以是和外网相连接的。
外网:广域网是一种低于跨度非常大的网络集合,它是由无数各局域网+独立服务器构成的。注:此处所说的局域网既可以是小型的广域网,也可以是局域网。
实际上,从规模上来看我们很难区分局域网和广域网,因为大小都是相对的,所以真正的局域网和广域网的区分是通过IP地址来实现的。
任何一台电脑要上网,都必须在网络上邮一个唯一的IP地址。在局域网内,这个IP地址是唯一的,但是在另一个局域网内,这个IP地址仍然能够用。
在广域网中,所有的IP地址都是唯一的。
只有内网的IP地址你是不能够上网的,上网必需要一个外网地址,这个外网地址又称为公网地址,这个公网地址是全球唯一的,它在你的对外出口的路由器上,也就是你的外网网关地址。
3、初识socket
socket:用于网络通信的模块,独立于语言
通过下面简单的代码看一下,socket
服务端:
import socket # 创建一个socket对象 server = socket.socket() # 给程序设置一个IP地址和端口号 ip_port = ('127.0.0.1',8080) # 绑定IP地址和端口号 server.bind(ip_port) # 监听IP地址和端口 server.listen() # 等待建立连接,conn时连接通道,addr是客户端地址 conn,addr = server.accept() # 服务端通过conn连接通道来收发消息,通过recv方法,recv里面的参数是字节 1024B=1KB from_client_msg = conn.recv(1024) print('zhoyou say:',from_client_msg.decode('utf-8')) # 回复消息:通过send方法,参数必须是字节类型的 conn.send('what?'.encode('utf-8')) # 关闭通道 conn.close() # 关闭socket对象, server.close()
客户端:
import socket # 创建一个socket对象 client = socket.socket() # 找到服务器的IP地址和端口 server_ip_port = ('127.0.0.1',8080) # 连接服务端的应用程序,通过connect方法,参数是服务端的IP地址和端口, client.connect(server_ip_port) # 发消息,用send方法,但是调用者是client的socket的对象 client.send('明天是周末吗?'.encode('utf-8')) from_server_msg = client.recv(1024) print('孙翔说:',from_server_msg.decode('utf-8')) client.close()
两个例子:
1、连续对话:server收一个发一个,client发一个收一个
服务端:
import socket server = socket.socket() ip_port = ('127.0.0.1',8080) server.bind(ip_port) server.listen() conn,addr = server.accept() while 1: from_client_msg = conn.recv(1024) print('来着星空的消息:',from_client_msg.decode('utf-8')) to_client_msg = input('大海:') conn.send(to_client_msg.encode('utf-8'))
客户端:
import socket client = socket.socket() client.connect(('127.0.0.1',8080)) while 1: to_server_msg = input('星空说:') client.send(to_server_msg.encode('utf-8')) from_server_msg = client.recv(1024) print('来自大海的消息:',from_server_msg.decode('utf-8'))
2、时间:server端:接收时间戳,转化成而格式化时间,client:每隔10秒钟把时间戳发给server端,time.time()
服务端:
import time import socket server = socket.socket() ip_port = ('127.0.0.1',8090) server.bind(ip_port) server.listen() conn,addr = server.accept() while 1: from_client_time = conn.recv(1024) from_clienttime_str = from_client_time.decode('utf-8') time_float = float(from_clienttime_str) time_stru = time.localtime(time_float) time_strf = time.strftime('%Y_%m-%d %H:%M:%S',time_stru) print(time_strf)
客户端:
import time import socket client = socket.socket() client.connect(('127.0.0.1',8090)) while 1: client.send(str(time.time()).encode('utf-8')) time.sleep(1)