网络编程之socketserver

"""
socketserver.py 中的5个基础类
        +------------+
        | BaseServer |
        +------------+
              |
              v
        +-----------+        +------------------+
        | TCPServer |------->| UnixStreamServer |
        +-----------+        +------------------+
              |
              v
        +-----------+        +--------------------+
        | UDPServer |------->| UnixDatagramServer |
        +-----------+        +--------------------+
"""

socketserver简单概括

__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相关业务逻辑
"""

socketserver各个类之间的关系

#!/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来选择对应的业务逻辑类来处理

原文地址:https://www.cnblogs.com/xiaofengchu/p/8461199.html

时间: 2024-10-13 09:13:27

网络编程之socketserver的相关文章

网络编程之socketserver初识

Server #!/usr/bin/env python # @Author : "Wjl" # @Date : 2017/12/22 # @Time : 11:07 # @SoftWare : PyCharm # @File : Server端并发聊天_Server.py import socketserver """ socketserver模块是python为我们写好的一个封装了网络操作相关的模块 比我们自己手写socket方便 "&quo

Python网络编程之socketserver实现多并发

利用socketserver实现多并发,socketserver内部会调用socket模块进行功能上的实现 client.py客户端脚本文件内容 #!/usr/bin/env python # _*_ coding:utf-8 _*_ import socket # 创建一个socket对象 obj = socket.socket() # 制定服务端的IP地址和端口 obj.connect(('127.0.0.1', 999, )) # 阻塞,等待服务端发送内容,接受服务端发送过来的内容,最大接

linux网络编程之shutdown() 与 close()函数详解

linux网络编程之shutdown() 与 close()函数详解 参考TCPIP网络编程和UNP: shutdown函数不能关闭套接字,只能关闭输入和输出流,然后发送EOF,假设套接字为A,那么这个函数会关闭所有和A相关的套接字,包括复制的:而close能直接关闭套接字. 1.close()函数 [cpp] view plain copy print? <span style="font-size:13px;">#include<unistd.h> int 

java网络编程之UDP实例

package Socket; import java.net.DatagramPacket; import java.net.InetAddress; public class Dgram { public static DatagramPacket toDatagram(String s, InetAddress destIA, int destPort) { byte[] buf = new byte[s.length() + 1]; s.getBytes(0, s.length(), b

java网络编程之TCP实例

Dgram类 package Socket; import java.net.DatagramPacket; import java.net.InetAddress; public class Dgram { public static DatagramPacket toDatagram(String s, InetAddress destIA, int destPort) { byte[] buf = new byte[s.length() + 1]; s.getBytes(0, s.leng

扯谈网络编程之Tcp SYN flood洪水攻击

简介 TCP协议要经过三次握手才能建立连接: (from wiki) 于是出现了对于握手过程进行的攻击.攻击者发送大量的FIN包,服务器回应(SYN+ACK)包,但是攻击者不回应ACK包,这样的话,服务器不知道(SYN+ACK)是否发送成功,默认情况下会重试5次(tcp_syn_retries).这样的话,对于服务器的内存,带宽都有很大的消耗.攻击者如果处于公网,可以伪造IP的话,对于服务器就很难根据IP来判断攻击者,给防护带来很大的困难. 攻与防 攻击者角度 从攻击者的角度来看,有两个地方可以

[深入浅出WP8.1(Runtime)]网络编程之HttpClient类

12.2 网络编程之HttpClient类 除了可以使用HttpWebRequest类来实现HTTP网络请求之外,我们还可以使用HttpClient类来实现.对于基本的请求操作,HttpClient类提供了一个简单的接口来处理最常见的任务,并为身份验证提供了适用于大多数方案的合理的默认设置.对于较为复杂的 HTTP 操作,更多的功能包括:执行常见操作(DELETE.GET.PUT 和 POST)的方法:获取.设置和删除 Cookie 的功能:支持常见的身份验证设置和模式:异步方法上提供的 HTT

黑马程序员——Java网络编程之UDP传输

网络编程 网络模型 通讯要素:InetAddress(对象):ip地址,网络中设备的标识,不可记忆,可用主机名,本地回环地址:127.0.0.1主机名localhost 端口号 传输协议:UDP,将数据的源及目的封装成数据包中,不需要建立连接,每个数据包的大小限制在64K内,无连接,是不可靠协议,不需要建立连接,速度快.力求速度,不求数据的准确性.比如聊天软件,网络会议. TCP:建立连接,形成传输数据的通道,在连接中进行大数据量传输,通过三次握手完成连接,是可靠协议,必须建立连接效率稍低. S

linux网络编程之TCP/IP基础篇(一)

从今天起,将会接触到网络编程,平台是linux,实现语言C语言,最后将会实现一个简易的miniftp服务器. 主要的内容安排为:linux网络编程之TCP/IP基础篇,SOCKET编程篇,进程间通信篇,线程篇,实战ftp篇. 1.ISO/OSI参考模型:open system interconnection开放系统互联模型是由OSI(international organization for standardization )国际标准化组织定义的网络分层模型,共七层. 各层的具体含义: 物理层