Python中的socketserver

鳄鱼君

发表文章数:642

热门标签

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python » Python中的socketserver

Socketserver

socketserver模块简化了编写网络服务器的任务。我们前面学习过的socket不能够支持多并发,也不能支持多用户同时操作。那么我们的socketserver可以,这部分大多数的伙伴都不理解,其实我觉得理不理解不重要,重要的是你需要知道大体的套路😗,就是怎么写的

初始化控制器类(必须继承BaseRequestHandler类)

  • init():初始化控制设置,初始化连接套接字,地址,处理实例等信息
  • handle(): 定义了如何处理每一个连接。
  • setup(): 在handle()之前执行.一般用作设置默认之外的连接配置
  • finish():在handle()之后执行。

变量:

  • self.request属性是套接字对象,所以使用self.request.xxxx调用套接字的函数
  • self.server包含调用处理程序的实例
  • self.client_address是客户端地址信息

定义服务端类型【将Handler类和服务端的地址端口参数传入】:

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.py

import 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.py

import 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一样,虽然可以开始多个客户端,但是只有一个客户端可以跟服务器端交互,其它的客户端都是在阻塞着,只有当前的客户端断开了,才会接收下一个等待着的客户端。

标签:

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《Python中的socketserver》 发布于2020-01-05

分享到:
赞(0) 赏杯咖啡

评论 抢沙发

2 + 1 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册