socketserver ----->> 服务器端的开发

socketserver:   实现服务器端同时处理多个请求

通过两个主要的类来处理网络请求:

  • 服务类
  • 请求处理类

一、服务类

1. 基础同步服务器

BaseServer

|    继承

V

TCPServer   —继承—>  UnixStreamServer

|     继承

V

UDPServer  —继承—>  UnixDatagramServer

其中,Baseserver不直接对外服务,而是通过TCPSever/ UDPServer 对外服务

TCPServer(address,handler) 支持使用IPv4的TCP协议的服务器,address是一个(地址,端口号)元组,handler是BaseRequestHandler或StreamRequestHandler类的子类实例
UDPServer(address,handler) 支持使用IPv4的UDP协议的服务器,handler是BaseRequestHandler或DataStreamRequestHandler类的子类实例
UnixStreamServer(address,handler) 使用Unix域套接字实现面向数据流协议的服务器
UnixDatagramServer(address,handler) 使用Unix域套接字实现数据报协议的服务器

以上四个服务类的实例都有以下方法和变量(部分)(实际上都来自于父类soketserver.BaseServer):

BaseServer.socket 用于传入请求的套接字对象
BaseServer.server_address 监听服务器的(地址,端口号)元组
BaseServer.RequestHandlerClass                                         传递给服务器构造函数并由用户提供的请求处理程序类
BaseServer.serve_forever() 处理无限请求,直到一个明确的shutdown()请求
BaseServer.service_action() 在serve_forever循环中被调用
BaseServer.shutdown() 停止serve_forever()循环,并等待直到它结束
BaseServer.server_close() 清理服务器(可能会被覆盖)

BaseServer.handle_request

处理一个请求,这个函数调用下面的方法依次是:get_request(),verify_request(),和process_request()。如果handle() 处理程序类的用户提供的方法引发异常,handle_error则将调用服务器方法,如果在timeout几秒内没有收到请求,handle_timeout() 将会被调用handle_request()返回。
BaseServer.fileno() 返回服务器正在监听的套接字的整数文件描述符,这个功能通常被传递给selector,允许在同一个进程中监视多个服务器
BaseServer.address_family 服务器套接字所属的协议族,例:socket.AF_INET,socket.AF_UNIX

2.自定义异步服务器

  • ForkingMinIn:(不直接对外服务)为每一个客户端请求派生一个新的进程去专门处理
  • ThreadingMinIn:(不直接对外服务)为每一个客户端请求派生一个新的线程去专门处理

sockserver 通过继承 ForKingMinIn和ThreadingMinIn预定义了以下几个可并发的服务类:

  • ForKingUDPServer(address,handler): UDP多进程
  • ForkingTCPServer(address,handler):TCP多进程
  • ThreadingUDPServer(address,handler) :UDP多线程
  • ThreadingTCPServer(address,handler):TCP多线程

二、请求处理类

通常需要继承BaserequestHandler, 并重写handle() 方法,当一个网络请求被创建时,一个新的实例就会被创建。

方法如下:

setup(): 在handle() 被调用前被执行,一般用于一些初始化操作,默认不执行任何操作

handle(): 当一个请求到来后,用户所要执行的操作,这个方法应被重写,操作self.reequest

finish(): handle() 之后被调用的函数,用于执行一个清理工作

三、如何创建一个socketserver

  1. 根据需要选择一个合适和服务类型,如,面向TCP连接的多线程服务器:ForKingTCPServer
  2. 创建一个请求处理的类,并且这个类要继承BaseRequestHanderclass,并且还要重写父类里handle() 方法
  3. 实例化服务器(如:TCPServer),并传递server IP和你上面创建的请求处理类,给这个TCPServer
  4. 调用服务器实例的请求方法:server.handle_requese() # 只处理一个请求,server.serve_forever() # 处理多个请求,永远执行
  5. 关闭连接server_close()

实例:

import socketserver
class myTCPHandler(socketserver.BaseRequestHandler):
def handle(self): # 尤其注意 “ handle ” 为固定值
print("客户端地址:",self.client_address) # 客户端IP地址 和端口号(字符串)
while True:
data = self.request.recv(1024)
if not data:break
print("客户端发来消息 :",data.decode('utf8'))
self.request.send(data) if __name__ =='__main__': HOST,PORT = "localhost" , 9999 serve = socketserver.ThreadingTCPServer((HOST,PORT),myTCPHandler)
serve.serve_forever() # server 一直运行

异步_ 服务器端

import socket                         # 和socket客户端 一毛一样
ip_port = ("127.0.0.1",9999) sk = socket.socket()
sk.connect(ip_port) while True:
client_input = input(">>:").strip()
sk.send(bytes(client_input,"utf8"))
server_d = sk.recv(1024)
print("服务器端说:",str(server_d,"utf8")) sk.close()

客户端

Python_socketserver的更多相关文章

随机推荐

  1. JSP错误页面处理的两种方式

    JSP错误页面处理的两种方式: 方法1(真能针对单一页面生效,不推荐): 出错页面实例 <%@ page language="java" contentType=" ...

  2. GIT入门文档

    集中式(SVN): 集中式版本控制系统,版本库是集中存放在中央服务器的,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器. 集中式版本控制系 ...

  3. PHPExcel导出数据时字段超过26列出错Invalid cell coordinate [1

    http://blog.csdn.net/dl425134845/article/details/46650961 以下是解决方案函数 /** *   方法名:    getExcel *   作用  ...

  4. chrome:禁用缓存

    F12->Network 非常好用!!!!!!!!!!

  5. ASP.NET MVC5高级编程 之 Ajax

    jQuery不仅支持所有现代浏览器,包括IE.Firefox.Safari.Opera和Chrome等,还可以在编写代码和浏览器API冲突时隐藏不一致性(和错误). 1. jQuery jQuery擅 ...

  6. 切换目录查询目录 tcp

    服务器 import socket import os import json sk = socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen() ...

  7. 【原创】大数据基础之Hadoop(2)hdfs和yarn最简绿色部署

    环境:3结点集群 192.168.0.1192.168.0.2192.168.0.3 1 配置root用户服务期间免密登录 参考:https://www.cnblogs.com/barneywill/ ...

  8. 《Spring5官方文档》新功能(4,3)

    <Spring5官方文档>新功能 原文链接 译者:supriseli Spring框架的新功能 这一章主要提供Spring框架新的功能和变更. 升级到新版本的框架可以参考.Spring g ...

  9. 调整linux进程优先级

    使用环境 当服务器资源比较紧张的时候,可以通过调整优先级来优先处理某个进程的请求 查看进行优先级(top) 优先级由 -20~19这个范围来表示优先级大小,数值越小,优先级越高, 设置方法: 使用re ...

  10. PHP项目笔记

    1.controller输出前端传来的值:var_dump($_POST['oid']); 2.var_dump($_POST['oid']);die: