本文内容参考文章地址:

https://m.aliyun.com/yunqi/articles/93088/

SocketServer模块

SocketServer是标准库中的一个高级模块(Python 3.x中重命名为socketserver),它的目标是简化很多样板代码,它们是创建网络客户端和服务器所必需的代码。这个模块中有为你创建的各种各样的类,如表2-3所示。

除了为你隐藏了实现细节之外,另一个不同之处是,我们现在使用类来编写应用程序。因为以面向对象的方式处理事务有助于组织数据,以及逻辑性地将功能放在正确的地方。你还会注意到,应用程序现在是事件驱动的,这意味着只有在系统中的事件发生时,它们才会工作。

事件包括消息的发送和接收。事实上,你会看到类定义只包括一个用来接收客户端消息的事件处理程序。所有其他的功能都来自使用的SocketServer类。此外,GUI编程(见第5章)也是事件驱动的。你会立即注意到它们的相似性,因为最后一行代码通常是一个服务器的无限循环,它等待并响应客户端的服务请求。它工作起来几乎与本章前面的基础TCP服务器中的无限while循环一样。

在原始服务器循环中,我们阻塞等待请求,当接收到请求时就对其提供服务,然后继续等待。在此处的服务器循环中,并非在服务器中创建代码,而是定义一个处理程序,这样当服务器接收到一个传入的请求时,服务器就可以调用你的函数。

创建SocketServer TCP服务器

首先导入服务器类,然后定义与之前相同的主机常量。其次是请求处理程序类,最后启动它。更多细节请查看下面的代码片段。

通过使用SocketServer类、TCPServer和StreamRequestHandler,该脚本创建了一个时间戳TCP服务器。
#!/usr/bin/env python

from SocketServer import (TCPServer as TCP, StreamRequestHandler as SRH)
from time import ctime HOST=''
PORT=21567
ADDR=(HOST, PORT) class MyRequestHandler(SRH):
def handle(self):
print '...connected from:', self.client_address
self.wfile.write('[%s] %s'%(ctime(), self.rfile.readline())) tcpServ=TCP(ADDR, MyRequestHandler)
print 'starting arleady!!! waiting for connection... '
tcpServ.serve_forever()


 

这里面没有写客户端,因此用浏览器访问  本机的    21567    端口。

解释:

from SocketServer import (TCPServer as TCP, StreamRequestHandler as SRH)

最初的部分包括从SocketServer导入正确的类。注意,这里使用了Python 2.4中引入的多行导入功能。如果使用的是较早版本的Python,那么将不得不使用完全限定的module.attribute名称,或者在同一行中导入两个属性。

class MyRequestHandler(SRH):
def handle(self):
print '...connected from:', self.client_address
self.wfile.write('[%s] %s'%(ctime(), self.rfile.readline()))

这里进行了大量的工作。我们得到了请求处理程序MyRequestHandler,作为SocketServer中StreamRequestHandler的一个子类,并重写了它的handle()方法,该方法在基类Request中默认情况下没有任何行为。

def handle(self):
pass

当接收到一个来自客户端的消息时,它就会调用handle()方法。而StreamRequestHandler类将输入和输出套接字看作类似文件的对象,因此我们将使用readline()来获取客户端消息,并利用write()将字符串发送回客户端。

因此,在客户端和服务器代码中,需要额外的回车和换行符。实际上,在代码中你不会看到它,因为我们只是重用那些来自客户端的符号。除了这些细微的差别之外,它看起来就像以前的服务器。

tcpServ=TCP(ADDR, MyRequestHandler)
print 'starting arleady!!! waiting for connection... '
tcpServ.serve_forever()

最后的代码利用给定的主机信息和请求处理类创建了TCP服务器。然后,无限循环地等待并服务于客户端请求。

创建SocketServer TCP客户端

这里的客户端很自然地非常像最初的客户端,比服务器像得多,但必须稍微调整它以使其与新服务器很好地工作。

SocketServer时间戳TCP客户端(tsTclntSS.py)

这是一个时间戳TCP客户端,它知道如何与类似文件的SocketServer类StreamRequest Handler对象通信。
#!/usr/bin/env python
from socket import * HOST='localhost'
PORT=21567
BUFSIZ=1024
ADDR=(HOST, PORT) while True:
tcpCliSock=socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)
data=raw_input('> ') if not data:
break tcpCliSock.send("%s\r\n"%data)
data=tcpCliSock.recv(BUFSIZ) if not data:
break print data.strip()
tcpCliSock.close()

SocketServer请求处理程序的默认行为是接受连接、获取请求,然后关闭连接。由于这个原因,我们不能在应用程序整个执行过程中都保持连接,因此每次向服务器发送消息时,都需要创建一个新的套接字。

												

SocketServer模块 《Python核心编程(第3版)》——2.5的更多相关文章

  1. python核心编程(第二版)习题

    重新再看一遍python核心编程,把后面的习题都做一下.

  2. 【Python千问 1】Python核心编程(第二版)导读

    第一章 欢迎来到Python世界 什么是Python Python的起源 Python的特点 下载Python 安装Python 运行Python Python文档 比较Python(与其它语言的比较 ...

  3. 【Python千问 2】Python核心编程(第二版)-- 欢迎来到Python世界

    1.1 什么是Python 继承了传统编译语言的强大性和通用性,同时也借鉴了简单脚本和解释语言的易用性. 1.2 起源 来源于某个项目,那些程序员利用手边现有的工具辛苦工作着,他们设想并开发了更好的解 ...

  4. Python核心编程第三版第二章学习笔记

    第二章 网络编程 1.学习笔记 2.课后习题 答案是按照自己理解和查阅资料来的,不保证正确性.如由错误欢迎指出,谢谢 1. 套接字:A network socket is an endpoint of ...

  5. 《Python核心编程》第二版第五章答案

    本人python新手,答案自己做的,如果有问题,欢迎大家评论和讨论! 更新会在本随笔中直接更新. 5-1.整型.讲讲Python普通整型和长整型的区别. Python的标准整形类型是最通用的数字类型. ...

  6. Python核心编程(第二版)正则表达式练习题解

    15-1. 识别下列字符串:“bat,” “bit,” “but,” “hat,” “hit,” 或 “hut” from re import match word = raw_input('inpu ...

  7. 《Python核心编程》第二版第三章答案

    本人python新手,答案自己做的,如果有问题,欢迎大家评论和讨论! 更新会在本随笔中直接更新. 我在Windows使用python版本是2.7.0 3–10. 异常.使用类似readTextFile ...

  8. 刷Python核心编程第三版的习题时遇到一个findall的坑

    在用正则表达式做以下查找时,发现re.findall()对于正则表达式有没有圆括号是有区分的,具体如下 line = 'Tue Sep 18 12:48:21 2029::ilziuv@zcntzir ...

  9. 《Python核心编程第3版中文版》(高清).PDF,免费无需任何解压密码

    链接:https://pan.baidu.com/s/18d3xinNX1oH5q8zpB10ABA 提取码:dx7h

  10. Python核心编程(第3版)PDF高清晰完整中文版|网盘链接附提取码下载|

    一.书籍简介<Python核心编程(第3版)>是经典畅销图书<Python核心编程(第二版)>的全新升级版本.<Python核心编程(第3版)>总共分为3部分.第1 ...

随机推荐

  1. PAT 1083 List Grades[简单]

    1083 List Grades (25 分) Given a list of N student records with name, ID and grade. You are supposed ...

  2. CSU 1642 Problem B[难][前缀和]

    Description 已知两个正整数a和b,求在a与b之间(包含a和b)的所有整数的十进制表示中1出现的次数. Input 多组数据(不超过100000组),每组数据2个整数a,b.(1≤a,b≤1 ...

  3. PAT 1088 Rational Arithmetic[模拟分数的加减乘除][难]

    1088 Rational Arithmetic(20 分) For two rational numbers, your task is to implement the basic arithme ...

  4. postman设置环境变量,字段值经过json转换后数值字节长度超过上限的问题

    在使用Tests进行环境变量的设置时,遇到这么一种情况,在返回的responseBody中的userId字段,字段返回的是数值类型,再经过json转换之后,发现保存的值跟接口返回的值不一致:如下图: ...

  5. Java String、StringBuffer、StringBuilder有什么区别

    ① String是Java语言非常基础和重要的类,提供了构造和管理字符串的各种基本逻辑.它是典型的immutable类,被声明成final class,所有属性也都是final的,由于它的不可变性,类 ...

  6. 常用DOS命令总结

    本文主要参考:http://www.jb51.net/article/12360.htm http://blog.csdn.net/kofterry/article/details/5183110 常 ...

  7. 【图像处理】计算Haar特征个数

    http://blog.csdn.net/xiaowei_cqu/article/details/8216109 Haar特征/矩形特征 Haar特征本身并不复杂,就是用图中黑色矩形所有像素值的和减去 ...

  8. 在Ubuntu 18.04上安装Tensorflow

    我们将经历几个阶段,安装cuda-9.0,cudnn和tensorflow cpu以及tensorflow gpu版本.最后我们将用cuda-9.0安装pytorch.在MARVEl电影中黑寡妇的“我 ...

  9. Ubuntu16.04下配置pip国内镜像源加速安装【转】

    本文转载自:https://blog.csdn.net/yucicheung/article/details/79095742 问题描述 基于国内网速的问题,我们直接pip安装包通常速度非常慢,而且经 ...

  10. Signing package index... Cannot open file '/home/jello/openwrt/key-build' for reading

    一.环境 发行版:Ubuntu 18.04.1 LTS 代号:bionic 内核版本:4.15.0-30-generic 二.背景 在编译Openwrt/LEDE时出现以下错误,进而自动终止了编译: ...