Socketserver
socketserver模块简化了编写网络服务器的任务。我们前面学习过的socket不能够支持多并发,也不能支持多用户同时操作。那么我们的socketserver可以,这部分大多数的伙伴都不理解,其实我觉得理不理解不重要,重要的是你需要知道大体的套路😗,就是怎么写的
初始化控制器类(必须继承BaseRequestHandler类)- init():初始化控制设置,初始化连接套接字,地址,处理实例等信息
- handle(): 定义了如何处理每一个连接。
- setup(): 在handle()之前执行.一般用作设置默认之外的连接配置
- finish():在handle()之后执行。
- self.request属性是套接字对象,所以使用self.request.xxxx调用套接字的函数
- self.server包含调用处理程序的实例
- self.client_address是客户端地址信息
TCPServer 支持ipv4的TCP协议的服务器。(我们一般比较常用)
server=socketserver.TCPServer((HOST,PORT),Handler)【Handler】
UDPServer 支持ipv4的UDP协议的服务器。
server=socketserver.UDPServer((HOST,PORT),Handler)
创建一个socketserver 至少分以下几步:
- 一、必须通过子类化BaseRequestHandlerclass并覆盖其handle()方法来创建请求处理程序类;这个方法将处理传入的请求。
- 二、必须实例化一个服务器类,将服务器地址和请求处理程序类传递给它。
- 三、调用服务器对象的handle_request() 或者serve_forever()方法来处理一个或多个请求。
- 四、调用server_close()关闭套接字。
按照上面的步骤,我们可以自己尝试写一个服务器端,然后再写一个客户端:
server.pyimport socketserver
class MyTcpHandler(socketserver.BaseRequestHandler):
#它在每个到服务器的连接中实例化一次,并且必须这样做重写handle()方法来实现与客户端。
def handle(self):
self.data=self.request.recv(1024).strip()#TCP套接字连接到客户端
print('{} 开始接受消息了'.format(self.client_address[0])) #打印客户端的ip地址
print(self.data)
self.request.send(self.data.upper())
def main():
host,port="localhost",9999 #创建服务器,绑定到端口9999上的本地主机
server=socketserver.TCPServer((host,port),MyTcpHandler) #将参数传递给我们定义的类
server.serve_forever()#激活服务器;它会一直运行到你用Ctrl-C中断程序
main()
client.pyimport socket
client=socket.socket()
client.connect(('localhost',9999))
while True:
input_content=input('请输入内容:').strip()
if len(input_content)==0:continue
client.send(input_content.encode())
data=client.recv(1024)
print('服务器端返回的消息为:',data)
client.close()
主要是服务器端改动比较大,跟socket中的服务器端写法不一样了,我们大致记住需要怎么写就行,上面的代码在运行时只会接受客户端一次交互,然后就断开了,我们可以再次修改一下服务器端:
import socketserver
class MyTcpHandler(socketserver.BaseRequestHandler):
def handle(self):
while True:
try:
self.data=self.request.recv(1024).strip()
print('{} 开始接受消息'.format(self.client_address[0])) #打印客户端的ip地址
print(self.data)
self.request.send(self.data.upper())
except ConnectionResetError as e:
print('客户端已经断开连接')
break
def main():
host,port="localhost",9999
server=socketserver.TCPServer((host,port),MyTcpHandler)
#server=socketserver.ThreadingTCPServer((host,port),MyTcpHandler) #客户端每来一个请求就会开启新线程
server.serve_forever()#即使一个连接报错了,但不会导致程序停止,而是会持续运行,与其他客户端通信
main()
这样客户端就可以和服务器端多次交互,只要不断开的话,我们还捕捉了ConnextionResetError异常
,客户端断开的时候就会报这样的异常,所以我们捉住它,然后可以接收下一个客户连接。我们可以看到上面的代码中有一行注释掉了,呢一行的作用就是让多个客户端同时跟服务器端进行交互,注释掉的话,跟我们的socket一样,虽然可以开始多个客户端,但是只有一个客户端可以跟服务器端交互,其它的客户端都是在阻塞着,只有当前的客户端断开了,才会接收下一个等待着的客户端。
声明:1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!