zoukankan      html  css  js  c++  java
  • 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
    ' % data).encode('utf-8'))    #这里使用的处理程序类对待套接字通信就像文件一样,所以使用行终止符(回车和换行符)
        data = tcpCliSock.recv(BUFSIZ)
        if not data:
            break
        print(data.strip())
        tcpCliSock.close()
  • 相关阅读:
    pat甲级 1155 Heap Paths (30 分)
    pat甲级 1152 Google Recruitment (20 分)
    蓝桥杯 基础练习 特殊回文数
    蓝桥杯 基础练习 十进制转十六进制
    蓝桥杯 基础练习 十六进制转十进制
    蓝桥杯 基础练习 十六进制转八进制
    51nod 1347 旋转字符串
    蓝桥杯 入门训练 圆的面积
    蓝桥杯 入门训练 Fibonacci数列
    链表相关
  • 原文地址:https://www.cnblogs.com/hiwuchong/p/8796715.html
Copyright © 2011-2022 走看看