通信与socket初识
网络的产生是由于不同机器之间的通信需求
两类应用,桌面安装的程序和web的网页程序
一.C/S架构
C/S架构:服务端在一直运行,等待服务别人;client/sever
客户端在需要使用的时候才开始用。需求都安装好程序使用
B/S架构(从属于C/S架构):不需要提前安装 browser(浏览器)/sever
软件C/S架构:浏览器,qq等....
硬件C/S架构:打印机...
二.网络通信的流程
mac地址是每台机器的出厂地址,走广播的形式,全球范围内会不安全且冗余
ip地址是用来划分广播域的,前三段相同则为同一个ip地址段,为同一子网,以广播的形式进行通信
联网之后,自动获取ip地址,被称为DHCP协议
Arp协议:通过ip地址获取mac地址
子网掩码:计算是否属于同一网段;如果交换机发现不是自己的IP,上传路由器,路由器广播各交换机,再度确认后包含的收到,不是的交换机直接扔掉
上述为内部的通信流程
访问外网
如果路由器发现不是属于自身路由范围下的,就访问DNS服务器 ,把输入的网址域名转化为ip,所有的网址都有ip(对应于服务器)
公网的ip地址(网关),内网ip经net转换,
然后经过路由器间的路由转发,按照路由协议计算出的最优路径,访问目标所在的路由器,
进行端口映射,直接根据该服务器单独的端口号访问程序即可,该子网下其他机器不可使用这个端口号
socket
服务器端
import socket #导入socket模块 server = socket.socket() #创建socket对象 ip_port = ('121.195.167.34',8002) #设置一个ip地址和端口号 server.bind(ip_port) #绑定ip和端口号 server.listen() #监听ip和端口号 conn,addr = server.accept() #等待建立连接,前者为建立的连接通道,后者为客户端地址 from_client_msg = conn.recv(1024) #通过recv方法,参数是字节(b),1024即为1kb,指一次性接受的消息大小 print(from_client_msg.decode('utf-8')) #conn.send(b'replay'.encode('utf-8')) #回复消息,通过send方法,参数必须是字节类型 conn.send(b'replay') conn.close() #关闭通道,通过close方法 server.close() #关闭服务器
客户端
import socket import time client = socket.socket() #创建一个socket对象 server_ip_port = ('121.195.167.34',8002) #找ip和端口号 client.connect(server_ip_port) #利用ip和端口号连接服务器程序 client.send(b'hello') #发消息,用send方法,字节类型 client.send('你好'.encode('utf-8')) #中文 # client.send(str(time.time()).encode('utf-8')) from_server_msg = client.recv(1024) #通过recv方法,参数是字节(b),1024即为1kb,指一次性接受的消息大小 print(from_server_msg.decode('utf-8')) client.close()
发送时加.encode;接收时加.decode。