【Python之旅】第五篇(三):Python Socket多线程并发

简介:

 前面的几个例子都是单线程的,下面再来说说多线程的。


1.多线程模块

    主要是socketserver模块,如下图示:

wKiom1YPmb2TPBqQAAJlgI3CCPk647.jpg


2.多线程原理

    如下图示说明:

wKioL1YPmgyj_atyAAIZT9TernQ085.jpg


3.SockteServer例子说明

服务器端:

wKiom1YPmkjiaEvhAALY_XJdPtI659.jpg


客户端:

wKioL1YPmnahMs6AAAGY8lr71ok291.jpg


4.演示

    还是以前面例子,对代码进行修改,作如下的演示。

Server端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import  SocketServer            #导入SocketServer,多线程并发由此类实现
 
class  MySockServer(SocketServer.BaseRequestHandler):    #定义一个类
 
     def handle(self):      #handle(self)方法是必须要定义的,可以看上面的说明
         print  'Got a new connection from' , self.client_address
         while  True:
             data = self.request.recv( 1024 )    #需要通过self的方法调用数据接收函数
             if  not data: break
             print  'recv:' , data
 
             self.request.send(data.upper())   #需要通过self的方法调用数据接收函数
 
if  __name__ ==  '__main__' :    #并非一定要用这样的方式,只是建议这样使用
     HOST =  ''              #定义侦听本地地址口(多个IP地址情况下),这里表示侦听所有
     PORT =  50007           #Server端开放的服务端口
     s = SocketServer.ThreadingTCPServer((HOST, PORT), MySockServer)
                               #调用SocketServer模块的多线程并发函数
     s.serve_forever()     #持续接受客户端的连接

Client端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import  socket
 
HOST =  '192.168.1.13'
PORT =  50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
 
while  True:
     user_input = raw_input( 'msg to send:' ).strip()
     s.sendall(user_input)
     data = s.recv( 1024 )
     print  'Received' , repr(data)
 
s.close()

演示:

步骤1:Server端运行服务端程序

1
2
xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python Thread_socket_server4.py 
===>光标在此处处于等待状态

步骤2:Client A端运行客户端程序

1
2
3
4
5
6
xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python client4.py 
msg to send:Hello!    ===>User输入数据
Received  'HELLO!'      ===>Server端返回的数据
msg to send:I'm Client A.
Received  "I'M CLIENT A."
msg to send:          ===>继续等待User输入数据

步骤3:在Server端中观察现象

1
2
3
4
5
xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python Thread_socket_server4.py 
Got a  new  connection from ( '192.168.1.13' 52650 )
recv: Hello!        
recv: I'm Client A.    ===>接收到Client A端发送的数据
===>光标在此处处于等待状态
步骤4:Client B端运行客户端程序
1
2
3
4
xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python client4.py 
msg to send:I'm Client B.    ===>User输入数据
Received  "I'M CLIENT B."      ===>Server端返回的数据
msg to send:                 ===>继续等待User输入数据

步骤5:在Server端中观察现象

1
2
3
4
5
6
7
xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python Thread_socket_server4.py 
Got a  new  connection from ( '192.168.1.13' 52650 )
recv: Hello!
recv: I'm Client A.
Got a  new  connection from ( '192.168.1.13' 52651 )
recv: I'm Client B.    ===>接收到Client A端发送的数据
===>光标在此处处于等待状态

    通过上面的演示,使用SocketServer便可以实现Python Socket的多线程并发。

相关文章
|
9天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
9天前
|
程序员 开发者 Python
Python网络编程基础(Socket编程) 错误处理和异常处理的最佳实践
【4月更文挑战第11天】在网络编程中,错误处理和异常管理不仅是为了程序的健壮性,也是为了提供清晰的用户反馈以及优雅的故障恢复。在前面的章节中,我们讨论了如何使用`try-except`语句来处理网络错误。现在,我们将深入探讨错误处理和异常处理的最佳实践。
|
19天前
|
算法 数据处理 Python
Python并发编程:解密异步IO与多线程
本文将深入探讨Python中的并发编程技术,重点介绍异步IO和多线程两种常见的并发模型。通过对比它们的特点、适用场景和实现方式,帮助读者更好地理解并发编程的核心概念,并掌握在不同场景下选择合适的并发模型的方法。
|
2天前
|
调度 Python
Python多线程、多进程与协程面试题解析
【4月更文挑战第14天】Python并发编程涉及多线程、多进程和协程。面试中,对这些概念的理解和应用是评估候选人的重要标准。本文介绍了它们的基础知识、常见问题和应对策略。多线程在同一进程中并发执行,多进程通过进程间通信实现并发,协程则使用`asyncio`进行轻量级线程控制。面试常遇到的问题包括并发并行混淆、GIL影响多线程性能、进程间通信不当和协程异步IO理解不清。要掌握并发模型,需明确其适用场景,理解GIL、进程间通信和协程调度机制。
18 0
|
6天前
|
Java API 调度
安卓多线程和并发处理:提高应用效率
【4月更文挑战第13天】本文探讨了安卓应用中多线程和并发处理的优化方法,包括使用Thread、AsyncTask、Loader、IntentService、JobScheduler、WorkManager以及线程池。此外,还介绍了RxJava和Kotlin协程作为异步编程工具。理解并恰当运用这些技术能提升应用效率,避免UI卡顿,确保良好用户体验。随着安卓技术发展,更高级的异步处理工具将助力开发者构建高性能应用。
|
8天前
|
网络协议 Java API
Python网络编程基础(Socket编程)Twisted框架简介
【4月更文挑战第12天】在网络编程的实践中,除了使用基本的Socket API之外,还有许多高级的网络编程库可以帮助我们更高效地构建复杂和健壮的网络应用。这些库通常提供了异步IO、事件驱动、协议实现等高级功能,使得开发者能够专注于业务逻辑的实现,而不用过多关注底层的网络细节。
|
12天前
|
Python
Python网络编程基础(Socket编程)UDP服务器编程
【4月更文挑战第8天】Python UDP服务器编程使用socket库创建UDP套接字,绑定到特定地址(如localhost:8000),通过`recvfrom`接收客户端数据报,显示数据长度、地址和内容。无连接的UDP协议使得服务器无法主动发送数据,通常需应用层实现请求-响应机制。当完成时,用`close`关闭套接字。
|
17天前
|
数据采集 Java API
python并发编程: Python使用线程池在Web服务中实现加速
python并发编程: Python使用线程池在Web服务中实现加速
17 3
python并发编程: Python使用线程池在Web服务中实现加速
|
12天前
|
缓存 监控 Python
解密Python中的装饰器:优雅而强大的编程利器
Python中的装饰器是一种强大而又优雅的编程工具,它能够在不改变原有代码结构的情况下,为函数或类添加新的功能和行为。本文将深入解析Python装饰器的原理、用法和实际应用,帮助读者更好地理解和利用这一技术,提升代码的可维护性和可扩展性。
|
29天前
|
编译器 测试技术 C++
【Python 基础教程 01 全面介绍】 Python编程基础全攻略:一文掌握Python语法精髓,从C/C++ 角度学习Python的差异
【Python 基础教程 01 全面介绍】 Python编程基础全攻略:一文掌握Python语法精髓,从C/C++ 角度学习Python的差异
159 0