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. 『TensorFlow』SSD源码学习_其五:TFR数据读取&数据预处理

    Fork版本项目地址:SSD 一.TFR数据读取 创建slim.dataset.Dataset对象 在train_ssd_network.py获取数据操作如下,首先需要slim.dataset.Dat ...

  2. python获取文件路径、文件名、后缀名的实例

    def jwkj_get_filePath_fileName_fileExt(filename): (filepath,tempfilename) = os.path.split(filename); ...

  3. Shiro中Realm

    6.1 Realm [2.5 Realm]及[3.5 Authorizer]部分都已经详细介绍过Realm了,接下来再来看一下一般真实环境下的Realm如何实现. 1.定义实体及关系   即用户-角色 ...

  4. (三)使用链式数据实现包(java)

    目标: 1) 描述数据的链式组织方式 2) 描述如何在链式节点链的开头添加新节点 3) 描述如何删除链式节点链的首节点 4) 描述如何在链式节点链中找到某个数据 5) 使用链式节点链实现ADT包 6) ...

  5. Linux上部署多个tomcat端口设置

    在Linux上部署多个tomcat主要是防止端口冲突的问题, tomcat服务器需配置三个端口才能启动,安装时默认启用了这三个端口,当要运行多个tomcat服务时需要修改这三个端口,不能相同.端口一: ...

  6. SQL server语句中如何实现分页

    SELECT TOP 页大小 *FROM table1WHERE id NOT IN ( SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id )ORDER ...

  7. 利用NPOI解析Excel的通用类

    using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using NPOI. ...

  8. select 练习语句

    select * from scott.dept;            /查看scott.dept表中的全局信息.        describe    scott.emp:             ...

  9. wps去除首字母自动大写

    首字母大写功能在不是进行英文编写时是个“自作聪明”的功能,我们可能会想把它关掉.

  10. python匿名函数以及return语句