本节内容:
1、C\S架构(****)
2、网络通信整个流程(***)
3、初识socket(*****)
一、C\S架构
不管哪个架构,他们都要进行网络通信,基本都要用socket,我们学习socekt就是为了完成C\S架构项目的开发
1、软件C\S架构:(client server)
客户端\服务端架构:京东,淘宝,今日头条,qq,微信.....
B\S架构:浏览器(browser)\服务端>>>统一接口
2、硬件C\S架构:
打印机.
二、网络通信的整个流程
1、电脑联网需要的相关的网络配置
网线:传输电信号
集线器:将所有连接到集线器的网络设备连通起来
交换机: 升级版的集线器
网卡:接受电信号(电脑插网线的地方就是网卡,网卡提供网络接口,里面烧制了全球唯一mac地址)
MAC地址:物理地址: 8C-EC-4B-88-B9-C9 #前三位厂商编号,后三位生产流水号
2、使用mac地址进行的信息交互
1、首先用户先进行单播,(带着自己的mac地址和信息,以及对方的mac地址进行单播)
2、然后集线器或交换机进行广播
不使用mac地址的原因:
广播风暴:网络拥堵,信息不安全
3、使用ip地址进行网络通信
1、Ip地址:
IPv4 地址: 192.168.15.46 #4个点分十进制
作用:划分广播域
192.168.15.46 #
Ipv4:192.168.15.0-192.168.15.255 # 八位二进制 256个电脑
Ipv6: 16进制的ip地址,暂时还不流行,因为ipv4地址还够用
2、子网和局域网的信息交互
1.网段
192.168.0.0 - 192.168.255.255
咱们班的ip地址段:192.168.15.0 -- 192.168.15.255
DHCP:自动分配IP地址(网关:即路由)
Arp表:保存着ip地址和mac地址对应关系(存在交换机)
Arp协议:广播的方式发送数据包,通过ip地址获取mac地址
子网掩码:计算两个ip地址是否属于同一网段:
255.255.255.0
源ip地址:192.168.15.46
11000000.10101000.00001111.00101110
11111111.11111111.11111111.00000000 # 上下相加得到网段,and相加
11000000.10101000.00001111.00000000 #192.168.15.0
目标的ip:192.168.16.30 #192.168.16.0
路由器:转发消息
路由协议:计算路由转发消息的最优路径
端口号:0 - 65535,确定电脑上的应用程序的
Ip地址+端口 = 确定某个电脑上的某个应用程序(8000以内的端口号都是内置的程序使用的,不要去使用它)
4、内网和外网
1、内网(局域网)
局域网就是在固定的一个地理区域内由2台以上的电脑用网线和其他网络设备搭建而成的一个封闭的计算机组。
局域网可以是独立封闭运行的,也可以是和外网相连接的。
2、外网(广域网)
是一种地域跨度非常大的网络集合。它是由无数个局域网+独立服务器构成的。
注意,此处所说的局域网既可以是小型的广域网,也可以是局域网。
5、公网地址
任何一台电脑要上网,都必须在网络上有一个唯一的IP地址。
在局域网内,这个IP地址是唯一的。
但是在另外一个局域网,这个IP地址仍然能够使用。
1、网关(在路由上)
如果只有内网的ip地址你是不能上网的,你上网肯定要通过一个外网地址,这个外网地址又称为公网地址,
NET转换技术,将局域网的ip地址转换为公网的ip地址
这个公网地址是全球唯一的
三、初识socket(*)
不管哪个架构,他们都要进行网络通信,基本都要用socket,我们学习socekt就是为了完成C\S架构项目的开发
注意:先运行server,然后再运行client,
然后你会发现client这个文件再输出台的地方让你输入内容,
你输入一个内容然后回车,你会发现server那边的控制台就输出了以client发送的内容
1这里留两个小练习:
1.
server端:接收时间戳时间,转换成格式化时间
client端:每隔10秒中把时间戳发给server端,time.time()
2. 一直对话的程序
server收一个发一个
client发一个收一个
fe1: 一直对话程序
服务端程序
import socket #实例化socket对象 server = socket.socket() #创建了一部手机 ip_port = ('192.168.15.46',8001) #买个电话卡 #绑定IP地址和端口 server.bind(ip_port) #插卡 #监听, server.listen() #开机 # server.listen(5) #监听着电话,我能监听5个,接到一个电话之后,后面还能有四个人给我打电话,但是后面这四个人都要排队等着,等着我第一个电话挂掉,再来第6个的时候,第六个人的手机会报错 #等待客户端连接 print(111111) conn,addr = server.accept() #等别人的电话,阻塞 print(222222) print(conn) print(addr) #发送消息 # conn.send(b'leihao') #必须是bytes类型的数据 server_msg = input('服务端说>>>>') conn.send(server_msg.encode('utf-8')) #必须是bytes类型的数据 #接受消息 from_client_msg = conn.recv(1024) #1024,一次性能够接受的消息大小1024B print('来自客户端的消息',from_client_msg) conn.send(b'gun') #挂电话,关闭通道 conn.close() #关机,关闭socket server.close()
客户端程序
import socket # 实例化客户端对象 client = socket.socket() server_ip_port = ("192.168.15.11", 10086) # 获取服务端ip地址和端口号 client.connect(server_ip_port) # 链接服务端程序,不是绑定,是链接 from_server_msg1 = client.recv(1024) # 阻塞在这里,等待服务端的信息 print("服务端第一条消息说:", from_server_msg1.decode('utf-8')) client.send(b'yuema') from_server_msg2 = client.recv(1024) print("服务端最后说:",from_server_msg2) # 升级版聊天 while 1: client_msg = input("客服端输入>>>>") # 客户端输入 if client_msg.upper() == "Q": break client.send(client_msg.encode("utf-8")) # 转换bytes传输 from_server_msg = client.recv(1024) # 服务端的消息 print("来自服务端的消息",from_server_msg.decode("utf-8")) # 对服务端传输过来的信息解码,打印显示 # 关闭 client.close()
fe2: 服务端将客户端传送过来的时间戳,转换成格式化时间返回个客户端
服务端程序
import socket, time server = socket.socket() # 实例化对象,相当于创建一部手机 ip_port = ("192.168.15.11", 9000) # 创建ip地址和端口,相当于创建电话卡 server.bind(ip_port) # 绑定ip和端口,确定某个电脑上的某个应用程序, 相当于插上电话卡 server.listen() # 可以监听多少个,在括号里面写,相当于可以接多少个人的电话 conn, addr = server.accept() # 阻塞在这里,一直到有人连接我,连接后拿到一个元组,里面是连接通道conn和对方的地址(ip+端口) while 1: from_client_msg = conn.recv(1024) # 必须通过通道,接收客户端的时间戳(注意此时时bytes类型的数据,需要解码) jie_gou_time = time.localtime(float(from_client_msg.decode("utf-8"))) # 时间戳(是个float,所以要用float来转化,不能用int) -> 结构化时间 server_msg = time.strftime("%Y-%m-%d %H:%M:%S", jie_gou_time) # 结构化时间 -》 格式化时间 time.sleep(10) conn.send(server_msg.encode("utf-8")) # 编码,发送给客户端 # conn.close() # 挂电话 # # server.close() # 关手机
客户端程序
import socket, time client = socket.socket() # 实例化客户端对象, server_ip_port = ("192.168.15.11", 9000) # 服务端的ip + 端口 client.connect(server_ip_port) # 客户端是链接服务端的ip地址和端口,不是绑定 while 1: time_chuo = time.time() # 获取时间戳 time1 = str(time_chuo) # 转换成字符串 client.send(time1.encode("utf-8")) # 编码传输,给服务端发送消息 from_server_msg = client.recv(1024) # 接收服务端的消息, print(from_server_msg.decode("utf-8")) # 解码,打印 client.close() # 客户端挂电话
四、QQ这种p2p的特殊网络通信方式
相当于在每个路由器上开了一个QQ客户端的端口,从而实现了变动ip的网络通讯
为什么说qq这种p2p的网络通信方式比较特殊呢,
因为它是两个局域网的电脑或者手机进行通讯,双方不能确定对方的IP地址,
因为你的qq也不知道在哪里登陆,用什么网络,对吧,
也就是说双方不知道对方的IP地址,怎么办,
需要借助第三方承接,就是腾讯,
那么这里面就涉及到了udp打洞,net穿透等技术,
有兴趣的可以去了解一下,腾讯为什么nb,
也是因为它基本上是国内第一家实现了这些技术的公司,
让我们的qq沟通更加方便。