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

1.多线程模块

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

2.多线程原理

如下图示说明:

3.SockteServer例子说明

服务器端:

客户端:

4.演示

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

Server端: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端: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端运行服务端程序xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python Thread_socket_server4.py

===>光标在此处处于等待状态

步骤2:Client A端运行客户端程序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端中观察现象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端运行客户端程序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端中观察现象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的多线程并发。

python socket多线程并发_【Python之旅】第五篇(三):Python Socket多线程并发相关推荐

  1. python go高并发_天下武功为快不破,戏说Python与Go高并发争锋!

    在这个以斗气大陆横行的世界,每一个大的势力宗门都有自己的杀手锏的功法,比如老牌的古族有C++这样的巨无霸语言,药族有C语言,几乎斗气大陆所有的操作系统都是用C语言做的,毕竟斗气都要靠吃丹药维持.而实力 ...

  2. python十大重点_你见过的最全面的 Python 重点

    由于总结了太多的东西,所以篇幅有点长,这也是我'缝缝补补'总结了好久的东西. Py2 VS Py3print成为了函数,python2是关键字 不再有unicode对象,默认str就是unicode ...

  3. 用python写秒杀程序_马上双十一,教你用Python实现秒杀系统

    简书博客地址: https://www.jianshu.com/u/8f4d80000566 大家好,我是老表 阅读文本大概需要 10 分钟 坚持学习很难,养成学习习惯更难 架构搭建是重点,代码或语言 ...

  4. python实现秒杀系统_双十一买买买,教你用Python实现秒杀系统

    原标题:双十一买买买,教你用Python实现秒杀系统 简书博客地址: https://www.jianshu.com/u/8f4d80000566 架构搭建是重点,代码或语言实现较简单. 本篇用pyt ...

  5. python相对路径库_如何最简单、通俗地理解Python的搜索路径、相对路径、绝对路径?...

    目录: 一.笔记 二.我的自学路线 三.笔记目录 一.笔记 1) 搜索路径 ① 能导入模块的话,表示搜索路径中有这个模块文件. ② 当你导入一个模块,Python解析器对模块位置的搜索顺序是:1. 当 ...

  6. sas和python哪个更容易_我该选择谁?SAS VS Python

    很多入门数据分析和数据挖掘的人士都在纠结我到底应该选择哪款软件?今天我们来比较一下老牌软件SAS和新起之秀Python在各方面的性能. 2016-8-19 10:37:21 上传 下载附件 (10.0 ...

  7. python第一章测试题_第一章 测试【含答案】 Python大数据分析

    (1)单选题 python中,常见的结构化数据不包括( ) A  表格型数据 B  多维数组 C  通过关键列相互联系的多个表 D  序列 E  图像数据 (2)单选题 下列不是数据分析的方法有( ) ...

  8. c语言python零基础教学_编程零基础应当如何开始学习 Python?附教程

    零基础学编程,用python入门是个不错的选择,虽然国内基本上还是以c语言作为入门开发语言,但在国外,已经有很多的学校使用python作为入门编程语言.此外,python在机器学习,人工智能领域也非常 ...

  9. 树莓派python交互界面实例_玩转树莓派-RaspBerry,使用Python开发定制界面

    1 准备SD卡8G以上,16G更佳. 编译过程中,会耗用大量存储空间.一定在编译之前运行sudo raspi-config,选择expand file system扩展SD卡的分区. 如果空间不够,会 ...

  10. python内存池机制_看过来啦!教你用Python进行内存管理

    原标题:看过来啦!教你用Python进行内存管理 现在学Python的小伙伴有很多啦!Python语言的发展前景也是有目共睹.小助手今天为大家带来了Python中内存管理的方法,一起来学习一下吧~ P ...

最新文章

  1. Codeforces 504 A (Round #285 div.1 A) Misha and Forest
  2. 【滴滴专场】深度学习模型优化技术揭秘
  3. nik collection滤镜
  4. vim 命令学习(高级篇)
  5. vivi eboot wince 烧写
  6. Android中动态的更改selector中某张图片的属性
  7. spring AOP实现——xml方法
  8. Tomcat配置解析
  9. modbustcp封装使用获取设备数据示例
  10. 去哪儿-05-recommendDev
  11. FindChildControl与FindComponent(动态创建的控件要通过Owner.FindComponent去找该控件)
  12. Leetcode每日一题:116.populating-next-right-pointers-in-each-node(填充每个节点的下一个右侧节点指针)
  13. Tomcat的结构概述
  14. java ssh2连接_通过JCraft的jsch包基于SSH2协议实现连接linux服务器提供终端操作的java工具实现类SftpUtil...
  15. 华为云GaussDB技术创新持续发力,荣膺DTCC2021创新大奖
  16. JAVA将图片转成base64导出到word中
  17. layui中关于重置按钮不起作用的提醒
  18. [线性代数] 1.3 n阶行列式
  19. 基本磁盘与所谓动态磁盘区别
  20. 互联网快讯:国家植物园在北京正式揭牌;极米Z6X Pro、极米H3S获赞赏;人民币兑日元逼近20大关

热门文章

  1. char型变量能不能存储一个中文汉字重写和重载的规则
  2. java 多行文本框_Swing常用组件之多行文本区JTextArea
  3. dategridview设置下拉框默认值_smtp服务器怎么设置
  4. linux输出和错误信息文件,Log4j配置将错误信息输出到指定文件中[linux tomcat]
  5. ROS入门笔记(五):ROS中运行rqt_plot的问题(kinetic)
  6. shell命令删除昨日的日志_linux定时自动清理日志文件
  7. mysql 单块读 多块读_dbfilesequentialread等待事件
  8. c++ 将deque部分元素赋值给vector_《STL源码剖析》学习笔记——序列式容器vector
  9. tcplayer currenttime设置不成功_为什么你的“会员体系”不成功?权益设置很重要...
  10. 学java里面包括php_【学习java和PHP区别你知道多少】