SocketServer

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SocketServer相关的知识,希望对你有一定的参考价值。

SocketServer模块

内部使用 IO 多路复用以及‘多线程‘和‘多进程‘,从而实现并发处理多个客户端请求的 socket 服务端.
讲人话就是:每个客户端请求连接到服务器时, socket 服务端都在会服务器中创建一个线程或者进程,来专门处理当前客户端的所有请求.

其实这个模块就是基于 tcp 的套接字,关键就是两个循环.一个链接循环,一个通讯循环

socketserver 模块中分为两大类: 

  1. server(服务) 类是为了解决链接问题而存在
  2. request(请求) 类是为了解决通信问题存在

分析一波 socketserver 源码

太多...略......

直接看总结??????

基于 tcp 的 socketserver 我们自己定义的类中

  1. self.server 就是套接字对象
  2. self.request 就是一个链接
  3. self.client_addr 就是客户端地址

最基础版本:

这是服务端, 客户端没写  把之前的直接拿过来就可以了.
# import socketserver
#
# class MYTCPServer(socketserver.BaseRequestHandler):
#     def handle(self):
#         # print(self.request)
#         # print(self.client_address)
#
#         while True :
#             try :
#                 data = self.request.recv(1024)  #self.request 就相当于 conn 了
#                 if not data: break
#                 self.request.send(data.upper())
#             except Exception:
#                 break
#
#         self.request.close()
#
# server = socketserver.ThreadingTCPServer((‘127.0.0.1‘,6666),MYTCPServer)
#
# server.allow_reuse_address = True
# server.serve_forever()

还是把客户端写了吧.

#客户端
from socket import *
client = socket(AF_INET,SOCK_STREAM)
client.connect((‘127.0.0.1‘,6666))

#循环
while True;
    msg = input(‘>> :‘).strip()
    if not msg: continue
    client.send(msg.encode(‘utf-8‘))
    data = client.recv(1024)
    print(data.decode(‘utf-8‘))

ThreadingTCPServer:

使用 ThreadingTCPServer:

  1. 创建一个继承自 ScoketServer.BaseRequestHandler的类
  2. 类中必须定义一个 handle 的方法
  3. 启动 ThreadingTCPServer

ForkingTCPServer:

ForkingTCPServer和 ThreadingTCPServer 的使用和执行流程基本一样, 区别:在内部分别为请求者建立 一个是线程,一个是进程.

就是把上面代码里的 server = socketserver.ThreadingTCPServer((‘127.0.0.1‘,6666),MYTCPServer) 变为server = socketserver.ForkingTCPServer((‘127.0.0.1‘,6666),MYTCPServer)

以上是关于SocketServer的主要内容,如果未能解决你的问题,请参考以下文章

socketserver.py代码阅读笔记

socketserver.py代码阅读笔记

socketserver实现并发

socketserver

socketserver源码解析和协程版socketserver

Day43:socketserver模块MySQL