python 异步io tcp服务器端_python网络编程socketserver模块(实现TCP客户端/服务器)...

摘录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模块

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

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

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

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

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

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

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

python网络编程-socketserver

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

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

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

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

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

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

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

随机推荐

算法与数据结构之选择排序(C语言)

#include #include void SelectSort(int *a,int n);//预声明要调用的函数 int main( ...

POJ 1905 Expanding Rods 二分答案几何

题目:http://poj.org/problem?id=1905 恶心死了,POJ的输出一会要lf,一会要f,而且精度1e-13才过,1e-12都不行,错了一万遍终于对了. #include < ...

最简单的CRC32源码-逐BYTE法

从按BIT计算转到按BYTE计算,要利用异或的一个性质,具体见前面的文章. 其实方法跟逐BIT法是一样的,我们只是利用异或的性质,把数据分成一BYTE一BYTE来计算,一B ...

get top k elements of the same key in hive

key points: 1. group by key and sort by using distribute by and sort by. 2. get top k elements by a ...

CentOS6.9中挂载NTFS移动硬盘

公司需要本地备份,不占用公网带宽,而本地服务器硬盘容量不够,所以需要将本地服务器centos 6.9系统的备份数据拷贝到移动硬盘. 所以需要在centos上挂载NTFS格式的移动硬盘. 方法/步骤: ...

C#多线程编程(2)-- async,await基本用法

上一章我简单介绍了异步编程的基本方法,推荐使用的方式是Task.Task是对线程池的封装,并且可以对Task使用async和await关键字.这两个关键字的使用非常简单,那么这两个关键字究竟起什么作用 ...

audio session config

#pragma mark - #pragma mark - audio session config - (void)setAudioSessionConfig { NSError *error; A ...

使用双引擎,让kbmmw 的客户端访问更方便

前面我们一直都讲了如何使用kbmmw smarthttpservice 给客户端提供REST  服务.主要都是返回给 浏览器访问的,如果我们使用delphi 开发桌面应用,如何使用这些服务呢?其实一切 ...

jquery遍歷

遍歷是什麼? jquery的遍歷指的是移動,就是從選中的元素根據元素之間的關係移動,直到找到目標元素.從DOM樹中,可以進行向上移動(祖先),向下移動(子孫)和水平移動(同胞). 祖先就是父,祖父,曾 ...

你可能感兴趣的:(python,异步io,tcp服务器端)