博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python网络编程socketserver模块(实现TCP客户端/服务器)
阅读量:6819 次
发布时间:2019-06-26

本文共 2271 字,大约阅读时间需要 7 分钟。

摘录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 ctimeHOST = ''PORT = 21567ADDR = (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 = 21567BUFSIZ = 1024ADDR = (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()

 

posted on
2018-04-12 15:13 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/hiwuchong/p/8796715.html

你可能感兴趣的文章
Linux 在添加一个新账号后却没有权限怎么办
查看>>
React 源码剖析系列 - 不可思议的 react diff
查看>>
走近抽象类与抽象方法
查看>>
4. 寻找两个有序数组的中位数
查看>>
React组件开发总结
查看>>
各种符号
查看>>
大道至简,职场上做人做事做管理
查看>>
抗干扰的秘诀:分类、整理与专注
查看>>
Number of Connected Components in an Undirected Graph
查看>>
BZOJ 3143 游走(高斯消元)
查看>>
SpringBoot 配置文件存放位置及读取顺序
查看>>
min.js格式化工具
查看>>
《软件工程-理论、方法与实践》读书笔记一
查看>>
POJ Problem Radar Installation 【贪心】
查看>>
redis 持久化方式
查看>>
Vue2.0设置反向代理解决跨域问题
查看>>
伪类link,hover,active,visited,focus的区别
查看>>
WTL 实践笔记
查看>>
漫谈C++:良好的编程习惯与编程要点(转载)
查看>>
Jquery plugin ScrollUp使用和实现
查看>>