python网络编程之socketserver
防伪码:存在的,忘却了,红尘万丈,入眸幻灭
在进行网络编程前我们先来说说在网络中服务器与客户端是如何交互的,也就是传说中的TCP三次握手。
三次握手的目的是为了确认客户端与服务端都能接收到对方的信息,以下是三次握手的详细过程:
第一次握手:客户端给服务端发送请求包
此时服务端确认自己可以接收到客户端的请求包
客户端无法确认服务端是否接收到了自己发的请求包
第二次握手:服务端回复客户端
此时客户端确认自己发的请求包已被服务端收到,也确认自己可以正常接收服务端发来的包
服务端可以确认自己能接收到客户端的包,但不能确认客户端是否能收到自己发送的包
第三次握手:客户端回复服务端
此时客户端已无疑问
服务端也确认刚刚客户端收到了自己的回复包。两边都没问题了,开始通信
在python中提供了两个socket编程模块,分别是socket和socketserver。
我们先来说说socket编程需要经历哪些步骤:
客户端:
1、创建socket客户端连接对象
2、通过连接对象的connect()方法连接服务端
3、通过连接对象的send()方法给服务端发送信息或指令
4、通过连接对象的recv()方法接收服务端的返回信息
5、通过连接对象的close()方法断开连接
服务端:
1、创建socket服务端连接对象
2、通过连接对象的bind()方法绑定要监听的IP与端口
3、通过连接对象的listen()方法来监听
4、通过连接对象的accept()方法创建与客户端交互的子连接对象并等待客户端连接
5、接收并处理客户端的请求
6、将处理结果返回给客户端
由于socket无法支持多用户,多并发。于是就有了socketserver
socketserver最主要的作用就是实现并发处理。
socketserver有以下几种类型:
TCPServer:tcp协议
class socketserver.TCPServer(server_address,RequestHandlerClass,bind_and_activate=True)
ThreadingTCPServer:多线程,多并发的TCPServer
class socketserver.ThreadingTCPServer(server_address,RequestHandlerClass,bind_and_activate=True)
ForkingTCPServer:多进程,多并发的TCPServer #在windows中不能使用这个
class socketserver.ForkingTCPServer(server_address,RequestHandlerClass,bind_and_activate=True)
UDPServer:udp协议
class socketserver.UDPServer(server_address,RequestHandlerClass,bind_and_activate=True)
UnixStreamServer:tcp协议,Unix本机间不同进程间通信可以使用这个server
class socketserver.UnixStreamServer(server_address,RequestHandlerClass,bind_and_activate=True)
UnixDatagramServer:udp协议,Unix本机间不同进程间通信可以使用这个server
class socketserver.UnixDatagramServer(server_address,RequestHandlerClass,bind_and_activate=True)
BaseServer是所有Server类型的基类。
TCPServer继承了BaseServer,UnixStreamServer继承了TCPServer。
UDPServer继承了TCPServer,UnixDatagramServer继承了UDPServer。
BaseServer有以下这些方法:
fileno():返回文件描述符
handle_request():处理单个请求
serve_forever(poll_interval=0.5):处理多个请求
poll_interval用来设置多长时间检查一下是否有收到shutdown()请求
当收到shutdown()请求后,调用service_actions(),serve_forever将停止提供服务
shutdown():告诉serve_forever()让其停掉
server_close():关闭服务
创建socketserver的步骤:
1、创建一个BaseRequestHandlerclass的子类并在子类中重写handle()方法
这个子类用来处理客户端的请求
与客户端所有的交互都是在handle()方法中编写
2、实例化一个server(如TCPServer)类,并且将Server_IP和上一步创建的子类传给这个实例化的类(此处是 TCPServer)作为参数
3、调用第2步实例化出来的对象的方法,这里假定这个实例化出来的对象为server:
server.handle_request():只处理一个请求,处理完后退出
server.serve_forever():处理多个请求,永远执行
4、调用close()方法关闭server
重写BaseRequestHandlerclass类的handle()方法:
def handle(self): #self.request is the TCP socket connected to the client self.data = self.request.recv(1024).strip() print("{} wrote:".format(self.client_address[0])) print(self.data) #just send back the same data,but upper-cased self.request.sendall(self.data.upper()) #sendall其实就是重复调用send,在这里也可以用send

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
MySQL基础备忘(2)之视图
使用过微软Access小型数据库管理系统的朋友可能永远不会忘记查询的概念,它也是二级Access考试的重中之重。掌握了查询部分,二级过关就有了绝对把握。查询之所以重要,其中一个主要原因在于其灵活性。创建数据库表初期,我们可以建立一些基础表格,但是由于现实需求的复杂性,很难一下设计出符合所有需求的所有表格,例如有时需要基于一些字段很多的大表创建一些临时性的若干“子表”。这种所谓的‘子表’,就可以使用查询来设计实现。从本质上讲,这种查询只是存储了创建这些查询的SQL语句,并没有生成独立的查询对应的‘子表’。当然,这也在一定程度上节约了存储。 在例如MySQL,MS SQL及Oracle等大型关系数据库中,你很难找到查询的概念。相反,你看到的是视图;它正是类似于Access中查询的东西。因此,这种视图在数据库设计中的位置也是不言而喻的。 一. 视图概念 MySQL视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。 对其中所引用的基础表来说...
- 下一篇
基于httpd实现虚拟主机
众所周知,一台物理服务器只能运行一个站点,但如若想实现一台服务器运行多个站点时,就不得不用到虚拟主机了。虚拟主机,顾名思义,就是一个虚拟出来的主机,当在服务单配置完成后,客户端访问时就像是访问了多个后端服务器。 实现虚拟主机有三种不同的方式: 基于IP的虚拟主机:使用不同的IP地址提供不同的站点 基于PORT的虚拟主机:使用不同的端口提供不同的站点 基于HOSTNAME的虚拟主机:使用不同的主机名提供不同站点 为了更直观的感受,下面一一实现基于三种方式的虚拟主机: 说明一下实验环境,实验主机为centos7.3,IP地址为:192.168.1.104 首先安装httpd服务,这里使用的是httpd2.4.6版本: #yum-yinstallhttpd 安装完成后查看安装文件: #rpm-qlhttpd 对应的文件做一些简单说明: 服务脚本:/etc/rc.d/init.d/httpd 脚本配置文件:/etc/sysconfig/httpd 运行目录:/etc/httpd 配置文件: 主配置文件:/etc/httpd/conf/httpd.conf 扩展配置:/etc/httpd/co...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS8安装Docker,最新的服务器搭配容器使用
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2全家桶,快速入门学习开发网站教程