SocketServer
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SocketServer相关的知识,希望对你有一定的参考价值。
SocketServer模块
内部使用 IO 多路复用以及‘多线程‘和‘多进程‘,从而实现并发处理多个客户端请求的 socket 服务端.
讲人话就是:每个客户端请求连接到服务器时, socket 服务端都在会服务器中创建一个线程或者进程,来专门处理当前客户端的所有请求.
其实这个模块就是基于 tcp 的套接字,关键就是两个循环.一个链接循环,一个通讯循环
socketserver 模块中分为两大类:
- server(服务) 类是为了解决链接问题而存在
- request(请求) 类是为了解决通信问题存在
分析一波 socketserver 源码
太多...略......
直接看总结??????
基于 tcp 的 socketserver 我们自己定义的类中
- self.server 就是套接字对象
- self.request 就是一个链接
- 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:
- 创建一个继承自 ScoketServer.BaseRequestHandler的类
- 类中必须定义一个 handle 的方法
- 启动 ThreadingTCPServer
ForkingTCPServer:
ForkingTCPServer和 ThreadingTCPServer 的使用和执行流程基本一样, 区别:在内部分别为请求者建立 一个是线程,一个是进程.
就是把上面代码里的 server = socketserver.ThreadingTCPServer((‘127.0.0.1‘,6666),MYTCPServer) 变为server = socketserver.ForkingTCPServer((‘127.0.0.1‘,6666),MYTCPServer)
以上是关于SocketServer的主要内容,如果未能解决你的问题,请参考以下文章