网络编程之socketserver
"""
socketserver.py 中的5个基础类
+------------+
| BaseServer |
+------------+
|
v
+-----------+ +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+ +------------------+
|
v
+-----------+ +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+ +--------------------+
"""
__version__ = "0.4"
import socket
import selectors
import os
import errno
import sys
try:
import threading
except ImportError:
import dummy_threading as threading
from io import BufferedIOBase
from time import monotonic as time # __all__属性由列表构成,它规定了模块的所有可见方法,会使属性列表之外的成员全部私有化。
__all__ = ["BaseServer", "TCPServer", "UDPServer",
"ThreadingUDPServer", "ThreadingTCPServer",
"BaseRequestHandler", "StreamRequestHandler",
"DatagramRequestHandler", "ThreadingMixIn"] if hasattr(os, "fork"):
__all__.extend(["ForkingUDPServer","ForkingTCPServer", "ForkingMixIn"]) if hasattr(socket, "AF_UNIX"): # 如果socket类型是AF_UNIX则将下面的添加到列表中
__all__.extend(["UnixStreamServer","UnixDatagramServer",
"ThreadingUnixStreamServer",
"ThreadingUnixDatagramServer"]) if hasattr(selectors, 'PollSelector'):
_ServerSelector = selectors.PollSelector
else:
_ServerSelector = selectors.SelectSelector class BaseServer: # 基础服务类 class TCPServer(BaseServer): # Tcp类 class UDPServer(TCPServer): # UDP类 if hasattr(os, "fork"):
class ForkingMixIn: # 提供多进程功能的类 class ThreadingMixIn: # 提供多线程功能的类 if hasattr(os, "fork"):
class ForkingUDPServer(ForkingMixIn, UDPServer): # UDP多进程类,实际就是继承了ForkingMixIn和UDPServer而已
class ForkingTCPServer(ForkingMixIn, TCPServer): # TCP多进程类,实际就是继承了ForkingMixIn和TCPServer而已 class ThreadingUDPServer(ThreadingMixIn, UDPServer): # UDP多线程类,实际就是继承了ThreadingMixIn和UDPServer而已
class ThreadingTCPServer(ThreadingMixIn, TCPServer): # TCP多线程类,实际就是继承了ThreadingMixIn和TCPServer而已 if hasattr(socket, 'AF_UNIX'): # 如果你的socket是AF_UNIX族,则定义下面4个类
class UnixStreamServer(TCPServer):
class UnixDatagramServer(UDPServer):
class ThreadingUnixStreamServer(ThreadingMixIn, UnixStreamServer):
class ThreadingUnixDatagramServer(ThreadingMixIn, UnixDatagramServer): class BaseRequestHandler: # 业务逻辑类 class StreamRequestHandler(BaseRequestHandler): # TCP相关的业务逻辑
class _SocketWriter(BufferedIOBase):
class DatagramRequestHandler(BaseRequestHandler): # UDP相关业务逻辑 """
总结:
socketserver.py 实际上就是封装了TCP服务UDP服务,多线程TCP服务,多线程UDP服务,多进程TCP服务,多进程UDP服务的类 TCPServer(BaseServer) # TCP类
UDPServer(TCPServer) # UDP类
ForkingTCPServer(ForkingMixIn, TCPServer) # 多进程TCP类
ForkingUDPServer(ForkingMixIn, UDPServer) # 多进程UDP类
ThreadingTCPServer(ThreadingMixIn, TCPServer) # 多线程TCP类
ThreadingUDPServer(ThreadingMixIn, UDPServer) # 多线程UDP类
StreamRequestHandler(BaseRequestHandler): # TCP相关的业务逻辑
DatagramRequestHandler(BaseRequestHandler): # UDP相关业务逻辑
"""
#!/usr/bin/env python
# @Author : "Wjl"
# @Date : 2017/12/22
# @Time : 15:12
# @SoftWare : PyCharm
# @File : Test_Server.py """
通过下面的类创建基础服务:
如果是AF_INET
+-----------+ +------------------+ +--------------------+
| TCPServer |------->| ForkingTCPServer | or | ThreadingTCPServer |
+-----------+ +------------------+ +--------------------+ +-----------+ +------------------+ +--------------------+
| UDPServer |------->| ForkingUDPServer | or | ThreadingUDPServer |
+-----------+ +------------------+ +--------------------+ 如果是AF_UNIX
+----------------+ +-------------------------+
|UnixStreamServer|------->|ThreadingUnixStreamServer|
+----------------+ +-------------------------+ +------------------+ +---------------------------+
|UnixDatagramServer|------->|ThreadingUnixDatagramServer|
+------------------+ +---------------------------+ 再将你的逻辑写在如下类中的handle方法中(),传递给上面的类,来调用
+--------------------+ +----------------------+ +------------------------+
| BaseRequestHandler |------->| StreamRequestHandler | or | DatagramRequestHandler |
+--------------------+ +----------------------+ +------------------------+ """
import socketserver class MyServer(socketserver.StreamRequestHandler): # 继承业务逻辑类
def handle(self): # 将你的业务逻辑写在handle方法中
print("服务端启动...")
while True:
conn = self.request # self.request就是客户端的socket对象
print(self.client_address) # self.client_address就是客户端地址元组
while True:
client_data = conn.recv(1024)
print(str(client_data, "utf8"))
print("waiting...")
conn.sendall(client_data)
conn.close() if __name__ == '__main__':
server = socketserver.TCPServer(('127.0.0.1', 8888), MyServer) # 创建TCP服务,将业务逻辑传递给它,好让服务和业务逻辑关联起来
server.serve_forever() # 通过forever()方法来接收请求,其实就是调用了socket.accept方法
# server.handle_request() # 还可以调用handle_request()来处理请求
总结:
想要玩转socketserver
1.首先需要明确使用什么地址簇, 是 AF_INET还是UX_INET
2.明确是使用TCP还是UDP,以此来确定是使用哪个类
3.明确有没有用到多线程或多进程
4.根据2来选择对应的业务逻辑类来处理
网络编程之socketserver的更多相关文章
- python3网络编程之socketserver
本节主要是讲解python3网络编程之socketserver,在上一节中我们讲到了socket.由于socket无法支持多用户和多并发,于是就有了socket server. socket serv ...
- 网络编程之socketserver初识
网络编程之socketserver初识 Server #!/usr/bin/env python # @Author : "Wjl" # @Date : 2017/12/22 # ...
- 网络编程之socketserver以及socket更多方法
关于socketserver 关于socket的更多方法 服务端套接字函数: s.bind() 绑定(主机,端口号)到套接字 s.listen() 开始tcp监听 s.accept () 被动接受tc ...
- 网络编程之socket
网络编程之socket socket:在网络编程中的一个基本组件,也称套接字. 一个套接字就是socket模块中的socket类的一个实例. 套接字包括两个: 服务器套接字和客户机套接字 套接字的实例 ...
- [深入浅出WP8.1(Runtime)]网络编程之HttpClient类
12.2 网络编程之HttpClient类 除了可以使用HttpWebRequest类来实现HTTP网络请求之外,我们还可以使用HttpClient类来实现.对于基本的请求操作,HttpClient类 ...
- java网络编程之TCP通讯
java中的网络编程之TCP协议的详细介绍,以及如何使用,同时我在下面举2例说明如何搭配IO流进行操作, /* *TCP *建立连接,形成传输数据的通道: *在连接中进行大数据量传输: *通过三次握手 ...
- 网络编程之UDP编程
网络编程之UDP编程 UDP协议是一种不可靠的网络协议,它在通信的2端各建立一个Socket,但是这个Socket之间并没有虚拟链路,这2个Socket只是发送和接受数据的对象,Java提供了Data ...
- 网络编程之TCP编程
网络编程之TCP编程 前面已经介绍过关于TCP协议的东西,这里不做赘述.Java对于基于TCP协议的网络通信提供了良好的封装,Java使用socket对象来代表两端的通信窗口,并通过Socket产生I ...
- 网络编程之Socket & ServerSocket
网络编程之Socket & ServerSocket Socket:网络套接字,网络插座,建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP ...
随机推荐
- 冒泡排序和选择排序-java
冒泡排序 假设有一数组int [] arr = {9,5,4,10,2};原理是第一个元素和第二个比较,如果前者大于后者便交换位置,然后第二个元素和第三个元素比较,如果前者大于后者便交换位置.以此类 ...
- 久未更 ~ 一之 —— 关于ToolBar
很久没更博客了,索性开一个久未更 系列 > > > > > 久未更 系列一:关于ToolBar的使用(后续补充) //让 ToolBar 单独使用深色主题 使得 tool ...
- Git的简单的基本使用
前言: 接触了Android Studio,自然是知道了Github这个网站,这个网站有许多大神们做的开源库,我们只需要简单地引入就是可以使用到这些开源库从而实现酷炫的效果,最近也是刚接触到Git的使 ...
- 免费空间上的mysql数据库怎么连接?
我申请了一个php的免费空间,空间有带mysql数据库,可是我不知道怎么连接. 平时在本地做php时我都是怎么连接的 可是现在到空间上了我就不知道怎么连接了.空间有提供phpmyadmin 会的教一下 ...
- iis配置完成,出现HTTP 错误 403.14 - Forbidden
版权声明:本文为博主原创文章,未经博主允许不得转载.转载请标明文章出处和原文链接. 403.14 禁止访问:在 Web 服务器上已拒绝目录列表 解决方案一:一般情况站点都是不会允许直接读取目录内容的, ...
- 【翻译】A Next-Generation Smart Contract and Decentralized Application Platform
原文链接:https://github.com/ethereum/wiki/wiki/White-Paper 当中本聪在2009年1月启动比特币区块链时,他同时向世界引入了两种未经测试的革命性的新概念 ...
- Web API (四) 特性路由(Attribute Route)
特性路由 是Web API 2 中提出的一种新的类型的路由,正如其名称那样,它是通过特性(Attribute) 来定义路由的,相比之前的基于模式(Convertion Based)的路由,特性路由 能 ...
- 遇到安装app不识别的情况
一般->blokfile->证书设定设置
- CCF系列之相邻数对(201409-1)
试题编号: 201409-1 时间限制: 1.0s 内存限制: 256.0MB 问题描述 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1. 输入格式 输入的第一行包含一个整数n,表示给 ...
- MyBatis的关于批量数据操作的测试
摘录自:http://www.linuxidc.com/Linux/2012-05/60863.htm MyBatis的前身就是著名的Ibatis,不知何故脱离了Apache改名为MyBatis.My ...