python--网络编程之socket
一 . 网络编程
CS架构 客户端服务端架构 服务端:提供服务的 客户端:享受服务的 BS架构:浏览器和服务端 网络通信流程: 集线器:将所有连接上它的电脑全部联通起来 交换机:升级版的集线器 网卡:接收处理电信号 Mac地址:网络设备的全球唯一标示,又称为物理地址 广播 单播 广播风暴 Ipv4地址:4个点分十进制 还有ipv6 作用:划分广播域 子网掩码:计算ip地址段,或者判断ip地址是否属于同一地址段 DHCP协议:自动获取ip地址 DNS:域名解析 Arp协议:通过ip地址获取mac,因为ip地址不固定,mac是全球唯一的 路由器:转发消息,管理内网 路由协议:计算路由转发的最优路径 端口:标示电脑上某个应用程序 Ip地址+端口 = 能够唯一锁定一台电脑和这个电脑上的某个应用程序 网关:把关用的,意思就说所有对外的请求都要经过网关 NAT技术:网络地址转换,内网ip地址转换为公网或者说外网的ip地址
我们在微信聊天, 淘宝购物, 百度上搜索的时候, 我们是客户端, 微信, 淘宝, 百度是服务端, 这种客户端和服务端进行交互的时候都是基于网络的.
客户端英文名称:Client(使用服务端的服务),服务端英文名称:Server(一直运行着,等待服务别人,不能有一天访问百度,百度页面打不开,不行吧。),下面所说的C\S架构就是说的Client\Server架构。
a.硬件C\S架构:打印机。
b.软件C\S架构:微信、优酷、浏览器(IE、谷歌等)。其中浏览器又比较特殊,很多网站是基于浏览器来进行访问的,浏览器和各个网站服务端进行的通讯方式又常被成为B\S架构(浏览器英文名称:Browser),web开发就是这个,如果我把所有的东西都做成应用程序是不是很麻烦啊,要装很多的软件对吧,所有就开始有了B\S架构,只需要个浏览器就能使用很多的工具了,并且提供了一个统一入口,这也是为什么B\S架构火了起来。但是手机端的还是用的应用程序多一些,但是手机端B\S架构也是一个趋势,就像微信的小程序和公众号,为什么说是一个趋势呢,不仅仅是因为方便因为省钱,而是提供了一个统一的入口,其实微信早就实现了。统一入口是什么意思呢?就像我们公司经常用的一个公司内部管理系统,请假、打卡、报销、查客户等等,如果这些功能都需要打开一个网页或者app,是不是很难受啊,那么公司就做了这么一个系统,大家在这个系统上关于上班的一些你需要的功能就都能完成了,这就是统一入口。这也是一个开发思想,大程序分成几个小程序,开发速度也快,开发一个小功能就能上线,而不需要等着所有的功能全部开发完成才上线,解耦分治思想,公司做开发时这种思想很流行,迭代开发。
不管哪个架构,他们都要进行网络通信,基本都要用socket,我们学习socekt就是为了完成C\S架构项目的开发
# 客户端 import socket # 创建socket对象 client = socket.socket() # 找到服务器端口,IP地址要用字符串,端口要用int 一般在8000以后 server_ip_port = ('192.168.12.56',8001) # 连接服务端的应用程序,通过connect方法,参数是服务端的IP地址和端口 client.connect(server_ip_port) while 1: to_server_msg = input('说给服务端听:') print('=======输入Q退出=======') if to_server_msg.upper() == 'Q': client.send(to_server_msg.encode('utf-8')) # 需要把Q停止的信息发送给服务端,服务端收到才能关闭服务端的管道 break else: # 发消息,用的是send方法,里面应该装bytes 需要把中文编码 client.send(to_server_msg.encode('utf-8')) # 服务端通过conn连接通道来收发消息,通过recv方法,recv里面的参数是字节(B),1024的意思1024B=1KB from_server_msg = client.recv(1024) # receive # 把bytes解码成中文 print('服务端返回的话:',from_server_msg.decode('utf-8')) client.close()
# 服务端 import socket # 创建socket对象 server = socket.socket() # 给程序设置一个IP地址和端口号 ip_port = ('192.168.12.56',8001) # 绑定IP地址和端口 server.bind(ip_port) # 监听IP地址和端口,括号里面什么都不用写(连接的客户端没有上限),也可以填数字,填几次等待着几个客户端 server.listen(3) print('====开始建立连接====') # 等待建立连接,conn是连接通道,address是客户端的地址,(阻塞程序) while 1: conn,addr = server.accept() while 1: # 服务端通过conn连接通道来收发消息,通过recv方法,recv里面的参数是字节(B),1024的意思1024B=1KB 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')) # 关闭通道 conn.close()