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的更多相关文章

  1. {Python之线程} 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Threading模块 九 锁 十 信号量 十一 事件Event 十二 条件Condition(了解) 十三 定时器

    Python之线程 线程 本节目录 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Thr ...

  2. 事件EVENT与waitforsingleobject的使用

    事件event与waitforsingleobject的配合使用,能够解决很多同步问题,也可以在数据达到某个状态时启动另一个线程的执行,如报警. event的几个函数: 1.CreateEvent和O ...

  3. 经典线程同步 事件Event

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇 一个经典的多线程同步问题> <秒杀多线程第五篇 经典线程同步关键段CS> 上一篇中使用关键段来解决经典的多线程同步互斥问题 ...

  4. C#事件(event)解析

    事件(event),这个词儿对于初学者来说,往往总是显得有些神秘,不易弄懂.而这些东西却往往又是编程中常用且非常重要的东西.大家都知道windows消息处理机制的重要,其实C#事件就是基于window ...

  5. 【温故知新】c#事件event

    从上一篇文章[温故知新]C#委托delegate可知,委托delegate和事件Event非常的相似,区别就是event关键字,给delegate穿上了个“马甲”. 让我们来看官方定义: 类或对象可以 ...

  6. 事件[event]_C#

    事件(event): 1.       事件是类在发生其关注的事情时用来提供通知的方式.例如,封装用户界面控件的类可以定义一个在单击该控件时发生的事件.控件类不关心单击按钮时发生了什么,但它需要告知派 ...

  7. C#中的委托(Delegate)和事件(Event)

    原文地址:C#中的委托(Delegate)和事件(Event) 作者:jiyuan51 把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写的设计模式--观察者(Obs ...

  8. MFC线程(三):线程同步事件(event)与互斥(mutex)

    前面讲了临界区可以用来达到线程同步.而事件(event)与互斥(mutex)也同样可以做到. Win32 API中的线程事件 HANDLE hEvent = NULL; void MainTestFu ...

  9. 重温委托(delegate)和事件(event)

    1.delegate是什么 某种意义上来讲,你可以把delegate理解成C语言中的函数指针,它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m,说白了就是可以把方法当作 ...

随机推荐

  1. CentOS6.8环境下搭建yum网络仓库

    CentOS6.8环境下搭建yum网络仓库 本文利用ftp服务,在CentOS6.8系统下搭建一个yum仓库,然后用另一台虚拟机访问该仓库.并安装程序包 安装ftp服务 查询ftp服务是否安装 [ro ...

  2. [PAT]数字分类

    #include <stdio.h> #include <stdlib.h> void A1(int *ar,int i); void A2(int *ar,int i); v ...

  3. 动态BT跳转

    METHOD eh_onzobject_id_link. ***定义 DATA : lv_crmt_object_guid TYPE crmt_object_guid, lv_index TYPE i ...

  4. log4j的一些参数说明

    参数 说明 例子 %c 列出logger名字空间的全称,如果加上{<层数>}表示列出从最内层算起的指定层数的名字空间 log4j配置文件参数举例 输出显示媒介 假设当前logger名字空间 ...

  5. python中json的使用

    在编写接口传递数据时,往往需要使用JSON对数据进行封装.python和json数据类型的转换,看作为编码与解码. 编码:json.dumps() Python JSON dict object li ...

  6. 一、持久层框架(Hibernate)

    一.Hibernate 使用JDBC做数据库相关功能开发会做很多重复性的工作,创建连接,关闭连接,把字段逐一映射到属性中等.Hibernate把这些进行封装起来,使得数据库访问变得轻松简单. 1.创建 ...

  7. Python标准数据类型的二次加工

    基于类继承的原理实现: class Li(list): #继承标准数据类型 list def app(self,p_object): #派生出新的 append功能 if not isinstance ...

  8. windows配置教程

    1.卸载预装软件 2.卸载非安装的预装软件 有些软件被改成了“绿色版”软件不能通过软件列表卸载,一般在C:\Program Files (x86)目录下 可以直接删除其文件夹,如果提示文件夹无法删除则 ...

  9. PAT-GPLT训练集 L1-039 古风排版

    PAT-GPLT训练集 L1-039 古风排版 注意:在输入字符串时,最后一个字符为'\0', 虽然输出时显示为空格,但是系统检查为‘\0’!!! 代码: #include<stdio.h> ...

  10. 每天CSS学习之box-shadow

    box-shadow是CSS3的属性,目的是给盒子添加一个或多个阴影.怎么感觉有点像光明使者使用该法术照亮敌人的阴暗面? box-shadow一共有六个属性,请看: box-shadow: h-sha ...