socketserver 和 事件Event
socketserver
处理socket服务端
# 服务端TCP:
import socketserver
from threading import current_thread
# fork linux 下一个进程接口 windows没有这接口 # 用于处理请求的类
class MyHandler(socketserver.BaseRequestHandler):
def handle(self):
print(self)
print(self.server) # 获取封装的服务器对象
print(self.client_address) # 客户端地址
print(self.request) # 获取客户端的socket对象
print(current_thread())
while True:
data = self.request.recv(1024)
print(data.decode("utf-8"))
self.request.send(data.upper())
server=socketserver.ThreadingTCPServer(("127.0.0.1",9014),MyHandler,True)# 是否绑定 默认为True
server.serve_forever() #客户端TCP:
import socket
client=socket.socket()
client.connect(("127.0.0.1",9014))
while True:
data=input(">>:")
client.send(data.encode("utf-8"))
dic=client.recv(1034)
print(dic.decode("utf-8")) # 服务端UDP:
import socketserver
from threading import current_thread
# fork linux 下一个进程接口 windows没有这接口 # 用于处理请求的类
class MyHandler(socketserver.BaseRequestHandler):
def handle(self):
print(self)
print(self.server) # 获取封装的服务器对象
print(self.client_address) # 客户端地址
print(self.request) # 获取客户端的socket对象,在udp中会自动获取客户端数据+客户端对象
print(current_thread())
while True:
data = self.request[0]
print(data.decode("utf-8"))
self.request[1].sendto(data.upper(),self.client_address)
break
server=socketserver.ThreadingUDPServer(("127.0.0.1",9014),MyHandler,True)# 是否绑定 默认为True
server.serve_forever() 客户端UDP:
import socket
client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# client.connect()
addr=("127.0.0.1",9014)
while True:
data=input(">>:")
client.sendto(data.encode("utf-8"),addr)
dic=client.recvfrom(1024)[0]
print(dic.decode("utf-8")) #ThreadingUDPServer 在初始化的时候创建了socket对象
#serve_forever() 将socket注册到select(多路复用)
#select中返回一个ready 如果为True则可以处理 _handle_request_noblock 内部创建了MyHandler #使用了socket OOP 多线程
#在正常开发中 #使用时的区别:
#ThreadingTCPServer
#handle 在连接成功时执行
#self.request 是客户端的socket对象 #ThreadingUDPServer
#handle 接受到数据执行时执行
#self.request 数据和服务器端的socket对象 Event 多线程知识点
事件是什么? 某件事情发生的信号
用来做什么? 在线程间通讯 然而线程间本来就可以相互通讯
作用就只剩下简化代码了 线程间通讯的例子
服务器启动需要五秒
客户端启动后连接服务器
去连接服务器必须保证服务器已经开启成功了 是否启动完成就是要通讯的内容 注意 Event线程通讯 仅仅用于简单的条件判断 说白就是代替bool类型 和if判断类似
set() 将状态修改为True
wati() 等待状态为True才能继续执行 举例:
实现相同效果的代码对比:
import time
from threading import Thread,Event #事件
event=Event()
# boot=False
def server_task():
global boot
print("正在启动....")
time.sleep(5)
print("启动...成功")
event.set()
# boot=True def client_task():
event.wait() # 一个阻塞的函数 会阻塞直到对evernt执行set函数为止
print("连接成功")
# while True:
# time.sleep(1)
# print("连接服务器")
# if boot:
# print("连接成功")
# break
# else:
# print("连接失败,服务器没有启动") t1=Thread(target=server_task)
t2=Thread(target=client_task)
t1.start()
t2.start()
# t1.join()
# t2.join()
socketserver 和 事件Event的更多相关文章
- {Python之线程} 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Threading模块 九 锁 十 信号量 十一 事件Event 十二 条件Condition(了解) 十三 定时器
Python之线程 线程 本节目录 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Thr ...
- 事件EVENT与waitforsingleobject的使用
事件event与waitforsingleobject的配合使用,能够解决很多同步问题,也可以在数据达到某个状态时启动另一个线程的执行,如报警. event的几个函数: 1.CreateEvent和O ...
- 经典线程同步 事件Event
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇 一个经典的多线程同步问题> <秒杀多线程第五篇 经典线程同步关键段CS> 上一篇中使用关键段来解决经典的多线程同步互斥问题 ...
- C#事件(event)解析
事件(event),这个词儿对于初学者来说,往往总是显得有些神秘,不易弄懂.而这些东西却往往又是编程中常用且非常重要的东西.大家都知道windows消息处理机制的重要,其实C#事件就是基于window ...
- 【温故知新】c#事件event
从上一篇文章[温故知新]C#委托delegate可知,委托delegate和事件Event非常的相似,区别就是event关键字,给delegate穿上了个“马甲”. 让我们来看官方定义: 类或对象可以 ...
- 事件[event]_C#
事件(event): 1. 事件是类在发生其关注的事情时用来提供通知的方式.例如,封装用户界面控件的类可以定义一个在单击该控件时发生的事件.控件类不关心单击按钮时发生了什么,但它需要告知派 ...
- C#中的委托(Delegate)和事件(Event)
原文地址:C#中的委托(Delegate)和事件(Event) 作者:jiyuan51 把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写的设计模式--观察者(Obs ...
- MFC线程(三):线程同步事件(event)与互斥(mutex)
前面讲了临界区可以用来达到线程同步.而事件(event)与互斥(mutex)也同样可以做到. Win32 API中的线程事件 HANDLE hEvent = NULL; void MainTestFu ...
- 重温委托(delegate)和事件(event)
1.delegate是什么 某种意义上来讲,你可以把delegate理解成C语言中的函数指针,它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m,说白了就是可以把方法当作 ...
随机推荐
- python基础之 026 包以及包的引入
内容梗概: 1. from xxx import xxx知识点补充 2. 包 1. 知识点补充. 我们现在知道可以使⽤用import和from xxx import xxx来导入一个模块中的内容.那有 ...
- fdisk分区和挂载
查看硬盘情况 fdisk -l 修改分区类型为LVM sudo fdisk /dev/sda (/dev/sda为对应的设备名,也可能是其它名字) 按n新建分区 按p选择主分区 按t改变分区的syst ...
- 前端VUE框架-es6
EMCAScript 6 又叫 es2015 1.常量和变量 常量: const a = "hello" 常量不能修改和重复定义 变量: let:定义一个块级作用域的变量 需要先定 ...
- UI基础七:给普通其他界面的PRODUCT 添加标准的搜索帮助
在使用的组件中添加组件对象 Outbound Plug中添加外向连接:OP_PRODUCT METHOD op_product. DATA: lv_title TYPE string, lr_cont ...
- python中几种循环体
条件判断与循环 1.条件判断 if <条件判断1>: <执行1> elif <条件判断2>: <执行2> elif <条件判断3>: < ...
- [LightOJ 1265] Island of Survival
Island of Survival You are in a reality show, and the show is way too real that they threw into an i ...
- 一、集合框架(Collection和Collections的区别)
一.Collection和Map 是一个接口 Collection是Set,List,Queue,Deque的接口 Set:无序集合,List:链表,Queue:先进先出队列,Deque:双向链表 C ...
- SQL调优(SQL TUNING)并行查询提示(Hints)之pq_distribute的使用
pq_distribute提示通常被用于提升数据仓库中分区表间的连接操作性能. pq_distribute提示允许你确定参与连接的表数据行在生产和消费并行查询服务进程间如何分配. pq_distrib ...
- Qt_Pro详解
在QT中,有一个工具qmake可以生成一个makefile文件,它是由.pro文件生成而来的,.pro文件的写法如下: 1. 注释 从“#”开始,到这一行结束. 2.模板变量告诉qmake为这个应用程 ...
- Linux c++ time different
下面这个函数可以得到微秒级别: #include<time.h> int clock_gettime(clockid_t clk_id,struct timespec *tp); 函数&q ...