# -*- coding:utf-8 -*-
'''
SocketServer
SocketServer 是在socket的基础上python编写的用于编写web服务的基础框架
python2.x 模块名: SocketServer
python3.x 模块名: socketerver 模块名字母大小写改变了
socketserver:
server 服务
TCPServer: ForkingTCPServer ThreadingTCPServer
UDPserver: ForkingUDPServer ThreadingUDPServer
handle 句柄 (服务器具体要处理的事情放在句柄里面,相当于一个执行工具)
STREAMRequestHandler
DatagramRequestHandrer
如果我们想要使用socketserver编写一个服务器需要server和handle两部分
创建server的方法:
第一种:直接调用已有的server类
Forking 多进程
Threading 多线程
第二种:自己通过继承重写
主要用于多线程的server
创建handle的方法:
BaseRequestHandler
setup 类似 __init__
Handle 用来处理请求
Self.request 当前请求
Self.client_address 请求用户的IP和端口
Self.server 当前服务
Finish 类似__del__
'''
#----------------------------------------------------------------------------
#第一种搭建服务器方法,只重写句柄
#----------------------------------------------------------------------------
import SocketServer
import threading
#1.重写句柄
class MyHandle(SocketServer.BaseRequestHandler):
'''
当前类是要重写一个句柄
'''
def setup(self):
print("this is our server")
def handle(self):
'''
这个方法是用来处理socket请求的
self.request 请求当前服务
self.client_address 请求用户的IP和端口
self.server 当前服务
'''
print("%s : %s 已经连接"%self.client_address)
content = self.request
recvData = content.recv(512)
print(recvData)
content.send(recvData.upper()) #把收到的字符串转化为大写
def finish(self):
print('server 完成')
if __name__ == '__main__':
server = SocketServer.ThreadingTCPServer(("",8000),MyHandle)
#开启服务的函数server.server_forever
server_thread = threading.Thread(target= server.serve_forever())
server_thread.start()
print("%s is start"%server_thread.name)
#----------------------------------------------------------------------
#第二种,重写server和handle
#----------------------------------------------------------------------
import SocketServer
import threading
#1.重写句柄
class MyHandle(SocketServer.BaseRequestHandler):
'''
当前类是要重写一个句柄
'''
def setup(self):
print("this is our server")
def handle(self):
'''
这个方法是用来处理socket请求的
self.request 请求当前服务
self.client_address 请求用户的IP和端口
self.server 当前服务
'''
print("%s : %s 已经连接"%self.client_address)
content = self.request
recvData = content.recv(512)
print(recvData)
content.send(recvData.upper()) #把收到的字符串转化为大写
#重写sever
class OurServer(SocketServer.ThreadingMixIn,SocketServer.TCPServer):
'''
当前是重写一个server
SocketServer.ThreadingMixIn 是继承多线程的特性
SocketServer.TCPServer 是继承的TCP服务的特性
结合就是使当前server拥有多线程TCP特性
继承顺序不可以改变
'''
pass
if __name__ == "__main__":
server =OurServer(("127.0.0.1",8000),MyHandle) #因为已经改写了server函数,所以这里也要改
server_thread = threading.Thread(target= server.serve_forever())
server_thread.start()
print("%s is start"%server_thread.name)
socket(六):使用SocketServer框架搭建客户端,其中涉及有多线程
最新推荐文章于 2022-08-12 10:25:09 发布