返回顶部
首页 > 资讯 > 后端开发 > Python >socketserver实现并发
  • 944
分享到

socketserver实现并发

socketserver 2023-01-30 22:01:49 944人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

tcp协议的Socket一次只能和一个客户端通信, 而socketsever可以时间和多个客户端通信. socketserver是在socket的基础上进行了一层封装, 它底层还是调用的socket.   我们通过以下代码来看下socke

tcp协议的Socket一次只能和一个客户端通信, 而socketsever可以时间和多个客户端通信.

socketserver是在socket的基础上进行了一层封装, 它底层还是调用的socket.

 

我们通过以下代码来看下socketserver如何使用:

import socketserver # 引入模块

class Myserver(socketserver.BaseRequestHandler):    # 定义一个类, 继承socketserver模块中的BaseRequestHandler类

    def handle(self):    #  # 写一个handle方法, 定死的(约束). 必须叫这个方法
        while 1:
            from_client_msg = self.request.recv(1024)  # 接收消息
            print(from_client_msg.decode('utf-8'))
            server_msg = input('服务端说>>>')
            self.request.send(server_msg.encode('utf-8'))   # 发送消息


if __name__ == '__main__':
    ip_port = ('127.0.0.1', 8008)
    server = socketserver.ThreadingTCPServer(ip_port, Myserver)     # 将IP,端口和定义的类传进socketserver.ThreadingTCPServer这个类.实例化一个对象
    server.serve_forever()  # 使用创建的对象调用server.serve_forever()方法. 这个方法的作用是让服务一直开着
socketserver_服务端
import socket

client = socket.socket()
client.connect(('127.0.0.1', 8008))

while 1:
    client_msg = input('请输入>>>')
    client.send(client_msg.encode('utf-8'))
    from_server_msg = client.recv(1024)
    print(from_server_msg.decode('utf-8'))
    if client_msg == "byebye":
        break

client.close()
socketserver_客户端

 简单解释以下什么是ThreadingTCPServer,多线程?

多线程就是我们的服务端通过多条线程同时和多个客户端进行沟通, 每条线程都对应一个客户端.

 

其实基于TCP的套接字, 关键就是两个循环, 一个连接循环, 一个通信循环

socketserver模块中分为两大类: server类(解决连接问题) 和 request类(解决通信问题)

server类:

request类:

继承关系:

 

 

 

以上面的代码中的代码为例, 分析socketserver源码:

ip_port = ('127.0.0.1', 8008)
server = socketserver.ThreadingTCPServer(ip_port, Myserver)
server.serve_forever()

 查找属性的顺序: ThreadingTCPServer->ThreadingMixIn->TCPServer->BaseServer

  1. 实例化得到server,先找类ThreadingTCPServer的__init__,在TCPServer中找到,进而执行server_bind,server_active
  2. 找server下的serve_forever,在BaseServer中找到,进而执行self._handle_request_noblock(),该方法同样是在BaseServer中
  3. 执行self._handle_request_noblock()进而执行request, client_address = self.get_request()(就是TCPServer中的self.socket.accept()),然后执行self.process_request(request, client_address)
  4. 在ThreadingMixIn中找到process_request,开启多线程应对并发,进而执行process_request_thread,执行self.finish_request(request, client_address)
  5. 上述四部分完成了链接循环,本部分开始进入处理通讯部分,在BaseServer中找到finish_request,触发我们自己定义的类的实例化,去找__init__方法,而我们自己定义的类没有该方法,则去它的父类也就是BaseRequestHandler中找....

 源码分析总结:

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

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

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

1.self.request是一个元组(第一个元素是客户端发来的数据,第二部分是服务端的udp套接字对象).

2.self.client_address即客户端地址

 

--结束END--

本文标题: socketserver实现并发

本文链接: https://lsjlt.com/news/180372.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • socketserver实现并发
    TCP协议的socket一次只能和一个客户端通信, 而socketsever可以时间和多个客户端通信. socketserver是在socket的基础上进行了一层封装, 它底层还是调用的socket.   我们通过以下代码来看下socke...
    99+
    2023-01-30
    socketserver
  • socketserver模块实现并发和连
    一.socketserver模块   1.sockeserver的源码流程   2.简单的使用 socketserver服务端 import socketserver class MyServer(socketserver.BaseR...
    99+
    2023-01-30
    模块 socketserver
  • python基于socketserver实现并发,验证客户端的合法性
    目录一、socketserver实现并发二、验证客户端合法性一、socketserver实现并发 tcp协议的socket是只能和一个客户端通信的,使用socketserver可以实现和多个客户端通信,他是在soc...
    99+
    2022-06-02
    python socketserver python 实现并发 python 验证客户端
  • PHP如何实现并发开发?
    PHP如何实现并发开发? 随着互联网的发展,网站的访问量越来越大,传统的单线程处理请求的方式已经不能满足需求,因此并发开发成为了必备的技能。那么,PHP如何实现并发开发呢?本文将介绍PHP的多进程、多线程、协程等并发开发方式,并附带演示代码...
    99+
    2023-06-03
    并发 git 开发技术
  • golang 实现并发求和
    使用golang并发求和,作为对golang并发的一个练习. 为了验证结果的正确性,要给出最传统的版本: func sum1(data []int) int { s := 0 ...
    99+
    2024-04-02
  • golang如何实现并发
    要实现并发,可以通过关键字”go“来启动一个新的”goroutine“:1、定义一个函数”doSomething“,编写具体的并发任务逻辑;2、定义”main“函数,通过”go“关键字启动新的”goroutine“,而主程序继续执行其他逻辑...
    99+
    2023-12-12
    Golang并发 Golang go语言
  • redis怎么实现并发锁
    Redis可以使用SETNX(SET if Not eXists)命令实现并发锁。以下是一个使用Redis实现并发锁的示例代码:``...
    99+
    2023-08-30
    redis
  • golang如何实现高并发
    Golang通过Goroutine和Channel来实现高并发。 Goroutine是Golang中轻量级的线程,可以同时执行多个G...
    99+
    2023-10-23
    golang
  • 简单实现并发:python concur
    可以使用python 3中的concurrent模块,如果python环境是2.7的话,需要下载https://pypi.python.org/packages/source/f/futures/futures-2.1.6.tar.gz#m...
    99+
    2023-01-31
    简单 python concur
  • java怎么实现高并发
    Java可以通过以下几种方法来实现高并发:1. 线程池:使用线程池来管理线程,避免频繁创建和销毁线程,提高线程的重用性和效率。2. ...
    99+
    2023-08-12
    java
  • nginx怎么实现高并发
    要实现高并发,可以通过以下几个方面来优化Nginx的性能。1. 使用事件驱动模型:Nginx使用异步事件驱动的模型来处理请求,这使它...
    99+
    2023-08-24
    nginx
  • php如何实现高并发
    这篇文章将为大家详细讲解有关php如何实现高并发,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。PHP 高并发实现 绪论 在现代网络环境中,高并发处理已成为 PHP 应用程序面临的关键挑战。优化 PHP 应...
    99+
    2024-04-02
    协程 异步I/O 消息队列 缓存 数据库优化
  • redis如何实现高并发
    redis通过以下机制实现高并发:单线程事件循环、i/o多路复用、无锁数据结构、惰性删除、管道化、客户端连接池以及可扩展到集群模式。 Redis如何实现高并发? Redis作为一种流行...
    99+
    2024-06-12
    redis 并发访问
  • 使用Java中的并发库和框架实现高并发
    文章目录 使用Java中的并发库和框架实现高并发背景介绍技术原理及概念基本概念解释技术原理介绍 Java多线程Java线程池Java异步编程Java并发控制相关技术比较实现步骤与流程准备...
    99+
    2023-10-06
    java jvm 网络
  • C++并发编程:如何利用多核CPU实现并发?
    c++++ 并发编程通过创建线程、互斥锁和条件变量来充分利用多核 cpu 的优势。创建线程允许任务并行执行。互斥锁充当锁,确保共享数据不会被多个线程同时访问,从而避免数据损坏。条件变量用...
    99+
    2024-05-01
    c++ 并发编程 并发访问
  • Redis实现高并发计数器
    业务需求中经常有需要用到计数器的场景:譬如一个手机号一天限制发送5条短信、一个接口一分钟限制多少请求、一个接口一天限制调用多少次等等。使用Redis的Incr自增命令可以轻松实现以上需求。以一个接口一天限制...
    99+
    2024-04-02
  • golang如何实现并发求和
    这篇文章主要介绍了golang如何实现并发求和,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。golang适合做什么golang可以做服务器端开发,但golang很适合做日志处...
    99+
    2023-06-14
  • PHP 能否实现并发处理?
    PHP 能否实现并发处理? PHP 作为一门非常流行的服务器端脚本语言,被广泛应用于 Web 开发领域。在 Web 应用中,PHP 常常需要处理大量的并发请求,因此,是否能够实现并发处理成为了广大 PHP 开发者关注的热点问题。本文将从几个...
    99+
    2023-09-22
    并发 unix apache
  • Nginx+Tomcat怎么实现高并发
    这篇文章给大家分享的是有关Nginx+Tomcat怎么实现高并发的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。在Ja...
    99+
    2023-06-28
  • Java如何实现并发编程?
    Java如何实现并发编程? 在今天的软件开发领域中,多核处理器已经成为了主流。因此,实现并发编程已经成为了必要的技能。Java是一种支持并发编程的编程语言,它提供了一些重要的工具和API来帮助开发人员实现并发编程。本文将介绍Java中实现并...
    99+
    2023-08-28
    numy shell 并发
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作