网络通信 & 初识socket
本节主要内容:
1.客户短\服务端架构
2.网络通信的流程
3.初识socket
一.客户端\服务端架构
客户端\服务端架构:
软件C\S架构:客户端\服务端架构:京东,淘宝,今日头条,qq,微信.....
B\S架构:浏览器(browser)\服务端>>>统一接口,例: 微信上的小程序
硬件C\S架构: 打印机.
二.网络通信的流程
网络通信中的一些基本概念:
网线:传送电信号
网卡: 提供网络接口,接收电信号
MAC地址: 长度为48位二进制, 通常由12位16进制数表示(前六位是厂商编号, 后六位是流水线号), 每块网卡出厂时都被烧制了全球唯一的mac地址.
Ethernet规定接入Internet的设备都必须具备网卡, 发送端和接收端的地址便是网卡的地址.
查看mac地址的方法:windows下在cmd窗口输入ipconfig -all指令:下面显示的这个物理地址就是mac地址。
集线器:将所有连接到集线器的网络设备连通起来
交换机: 升级版的集线器
路由器:用来转发消息
路由协议:用来计算转发消息的最优路径
IP地址: 互联网协议地址, 它是IP协议提供的一种统一的地址格式, 它为互联网上的每一个网格和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异.在IPv4里有32位二进制数组成, 通常被分割为4个8位二进制数, 由四个点分十进制数表示.
DHCP服务: 是一个局域网的网络协议, 使用UDP协议工作, 用于内部网络自动分配IP地址
子网掩码: 格式与IP地址一样, 将某个IP地址划分成网络地址和主机地址两部分, 用来判断两个IP地址是否在一个网段.1表示网络地址, 0表示主机地址.
网关: 一个网络通向其他网络的IP地址, 即路由器的IP地址
DNS: 进行域名(domain name)和与之相对应的IP地址 (IP address)转换的服务器
广播: 将源MAC地址,目标MAC地址及信息通过交换机和路由器发送给局域网内的所有其他设备
ARP协议: 地址解析协议,主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址.
网络通信的流程:
关于网络通信的整个流程请点击链接查看.
三.初识socket
socket是实现网络编程的工具, 以下是两段简单的代码.
import socket #创建一个socket对象 server = socket.socket() #相当于创建了一部电话 ip_port = ('192.168.111.1',8001) #创建一个电话卡 server.bind(ip_port) #插上电话卡 server.listen(5) #监听着电话,我能监听5个,接到一个电话之后,后面还能有四个人给我打电话,
但是后面这四个人都要排队等着,等着我第一个电话挂掉,再来第6个的时候,第六个人的手机会报错 print('11111') #等着别人给我打电话,打来电话的时候,我就拿到了和对方的这个连线通道conn和对方的电话号码addr conn,addr = server.accept() #阻塞住,一直等到有人连接我,连接之后得到一个元祖,里面是连线通道conn和对方的地址(ip+端口) print('22222') print(conn) print('>>>>>>>>>',addr) while True: from_client_data = conn.recv(1024) #服务端必须通过两者之间的连接通道来收消息 from_client_data = from_client_data.decode('utf-8') print(from_client_data) if from_client_data == 'bye': break server_input = input('明威说>>>>:') conn.send(server_input.encode('utf-8')) if server_input == 'bye': break conn.close() #挂电话 server.close() #关手机
import socket import time client = socket.socket() server_ip_port = ('192.168.111.1',8001) client.connect(server_ip_port) while True: client_input = input('小文说>>>>:') client.send(client_input.encode('utf-8')) #给服务端发送消息 if client_input == 'bye': break from_server_data = client.recv(1024) print('来自服务端的消息:',from_server_data.decode('utf-8')) if from_server_data.decode('utf-8') == 'bye': break client.close() #客户端挂电话