摘录python核心编程

socketserver(python3.x版本重新命名)是标准库中的网络编程的高级模块。通过将创建网络客户端和服务器所必须的代码封装起来,简化了模板,为你提供了各种各样的类。

除了隐藏了实现细节之外,它督促我们使用类(面向对象的思维)来编写应用程序,并且,这些应用程序是时间驱动的(即,只有在系统中的事件发生的时候,程序才会工作)。

事件,包括消息的发送和接收。在原始的服务器循环中,我们阻塞等待请求,当接收到请求时就对其提供服务,然后继续等待。而使用面向对象的socketserver后,服务器的循环,并非在服务器中创建代码,而是定义一个处理程序,当服务器接收到一个传入的请求时,服务器就可以调用你的函数。

下表是socketserver模块的类:

描述
BaseServer 包含核心服务器功能和mix-in类的钩子;仅用于推导,这样不会创建这个类的实例;可以使用TCPServer或UDPServer创建类的实例
TCPServer/UDPServer 基础的网络同步TCP/UDP服务器
UnixStreamServer/UnixDatagramServer 基于文件的基础同步TCP/UDP服务器
ForkingMixin/ThreadindMixin 核心派出或线程功能;只用作mix-in类于一个服务器类配合实现一些异步性;不能直接实例化这个类
ForkingTCPServer/ForkingUDPServer ForkingMixin和TCPServer/UDPServer的组合
ThreadingTCPServer/ThreadingUDPServer ThreadingMixin和TCPServer/UDPServer的组合
BaseRequesthandler 包含处理服务请求的核心功能;仅仅用于推导,无法创建这个类的实例;
StreamRequestHandler/DatagramRequestHandler 实现TCP/UDP服务器的服务处理器

创建socketserver TCP服务器

下面的tsTservSS.py脚本中,首先导入服务器类,然后定义与之相同的主机常量。其次是请求处理程序类,最后启动它:

#导入必须的类
from socketserver import (TCPServer as TCP ,StreamRequestHandler as SRH)
from time import ctime HOST = ''
PORT = 21567
ADDR = (HOST,PORT) class MyRequestHandler(SRH): #这是一个继承自socketserver模块中的StreamRequestHandler的一个子类
def handle(self): #重写handle()方法。当接收来自客户端的消息时,就会调用这个方法
print('连接来自于:',self.client_address)
'''
StreamRequestHandler类将输入输出套接字看做是类似文件的对象,因此可以使用readline()来获取客户端的消息
同时利用write()将字符串发送回客户端
'''
self.wfile.write(('[%s] %s' % (ctime(),self.rfile.readline())).encode('utf-8')) #必须要编码 tcpServ = TCP(ADDR,MyRequestHandler) #利用给定的主机信息和请求处理类创建了TCP服务器
print('等待连接……')
tcpServ.serve_forever() #服务器无限循环

创建socketserver TCP客户端

from socket import *

HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT) while True:
#socketserver请求处理程序的默认行为是接受连接、获取请求、关闭连接。
#所以,不能在应用程序整个执行过程中都保持连接——即,每次发送消息,都要创建新的套接字,并在最后关闭
#不过,可以通过重写请求处理类中的适当的方法可以改变他。
tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)
data = input('请输入:')
if not data :
break
tcpCliSock.send(('%s\r\n' % data).encode('utf-8')) #这里使用的处理程序类对待套接字通信就像文件一样,所以使用行终止符(回车和换行符)
data = tcpCliSock.recv(BUFSIZ)
if not data:
break
print(data.strip())
tcpCliSock.close()

python网络编程socketserver模块(实现TCP客户端/服务器)的更多相关文章

  1. python网络编程-socketserver模块

    使用socketserver 老规矩,先引入import socketserver 必须创建一个类,且继承socketserver.BaseRequestHandler 这个类中必须重写handle( ...

  2. [Python网络编程]一个简单的TCP时间服务器

    服务器端: 1.创建一个面向网络的TCP套接字对象socket, 2.绑定地址和端口 3.监听 4.当有客户端连接时候,接受连接并给此连接分配一个新的套接字 5.当客户端发送空信息时候,关闭新分配的套 ...

  3. UNIX网络编程 第5章 TCP客户/服务器程序示例

    UNIX网络编程 第5章 TCP客户/服务器程序示例

  4. python网络编程——SocketServer/Twisted/paramiko模块

    在之前博客C/S架构的网络编程中,IO多路复用是将多个IO操作复用到1个服务端进程中进行处理,即无论有多少个客户端进行连接请求,服务端始终只有1个进程对客户端进行响应,这样的好处是节省了系统开销(se ...

  5. (网络编程)socketserver模块服务端实现并发

    基于tcp的套接字(实现并发),关键就是两个循环,一个链接循环,一个通信循环 基于udp的套接字(不是正真意义上的并发,实现真并发) socketserver模块中分两大类:server类(解决链接问 ...

  6. python网络编程-socketserver

    一:socketserver简化了网络服务器的编写. 它有4个类:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer. 这4个类是同步进行处 ...

  7. python 网络编程--socket模块/struct模块

    socket模块: 客户端:CS架构,  client -> server 浏览器:BS架构,  browser -> server 网络通信本质:传输字节 doc命令查看ip地址:ipc ...

  8. 网络编程------socketserver模块以及socket模块的更多用法.

    socketserver模块 内置模块 (其实现原理为并发) socketserver这个模块主要是为了解决: TCP协议中,服务器不能同时连接多个客户端的问题 是处于socket抽象层和应用层之间的 ...

  9. python网络编程(六)---web客户端访问

    1.获取web页面 urllib2 支持任何协议的工作---不仅仅是http,还包括FTP,Gopher. import urllib2 req=urllib2.Request('http://www ...

随机推荐

  1. (六)OpenStack---M版---双节点搭建---Neutron安装和配置

    ↓↓↓↓↓↓↓↓视频已上线B站↓↓↓↓↓↓↓↓ >>>>>>传送门 1.创建网络服务数据库 2.获得 admin 凭证来获取只有管理员能执行的命令的访问权限 3.创 ...

  2. JavaScript笔记三

    1.数据类型 - JS中一共分成六种数据类型 - String 字符串 - Number 数值 - Boolean 布尔值 - Null 空值 - Undefined 未定义 - Object 对象 ...

  3. Java多线程面试题:线程锁+线程池+线程同步等

    1.并发编程三要素? 1)原子性 原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行. 2)可见性 可见性指多个线程操作一个共享变量时,其中一个线程对变量 ...

  4. Erlang/Elixir精选-第1期

    第1期(20191202) 文章 A short guide to the structure and internals of the Erlang distributed messaging fa ...

  5. JS中的同步异步编程

    首先我们先看看同步与异步的定义,及浏览器的执行机制,方便我们更好地理解同步异步编程. 浏览器是多线程的,JS是单线程的(浏览器只分配一个线程来执行JS)   进程大线程小:一个进程中包含多个线程,例如 ...

  6. docker配置mysql主从与django实现读写分离

    一.搭建主从mysql环境 1 下载mysql镜像 docker pull mysql:5.7 2 运行刚下载的mysql镜像文件 # 运行该命令之前可以使用`docker images`是否下载成功 ...

  7. Chapter 05—Advanced data management(Part 1)

    一. R的数学函数,统计函数及字符处理函数 例01:一道实际应用题 一组学生其数学,科学和英语的成绩如下表: 任务:根据成绩,决定对每个学生的单独指导: 前20%的学生的成绩为A,次之为B,以此类推: ...

  8. 八大机器学习框架对比及Tensorflow的优势

    八大机器学习框架的对比: (1)  TensorFlow:深度学习最流行的库之一,是谷歌在深刻总结了其 前身 DistBelief 的经验教训上形成的:它不仅便携.高效.可扩 展,还能再不同计算机上运 ...

  9. java.security.NoSuchProviderException: no such provider: BC 的问题解决

    第一种方式 1.修改以下两个文件 %JDK_Home%\jre\lib\security\java.security %JRE_Home%\jre\lib\security\java.security ...

  10. 188W+程序员关注过的问题:Java到底是值传递还是引用传递?

    在逛 Stack Overflow 的时候,发现了一些访问量像阿尔卑斯山一样高的问题,比如说这个:Java 到底是值传递还是引用传递?访问量足足有 188万+,这不得了啊!说明有很多很多的程序员被这个 ...