asyncore : Python裡面的非同步Socket

32、网络编程基础:asyncore、select与socket模块详解 本文深入解析了Python中用于网络编程的asyncore、select和socket模块。详细介绍了asyncore模块的事件驱动编程模型及其核心dispatcher类,select模块的多路复用I/O机制,以及socket模块提供的底层网络通信功能。同时,通过示例代码展示了如何使用这些模块构建网络应用程序,如简单的Web服务器和文件传输服务器。此外,还讨论了网络编程的性能优化策略和错误处理方法,帮助开发者构建高效、稳定的网络应用。 阅读详情
 

MFC裡面有個Class叫做CAsyncsocket, 它是用實作非同步的socket.

在實際的應用裡面, 一個應用程式很少會固定等待socket連線, 或是傳送資料, 通常都是在突然的情況下一個socket要進行連線, 或是要傳送資料. 所以非同步的socket的好處就在這裡, 你可以指定在socket發生連線或是傳送資料的時候進行某個動作, 而CAsyncsocket就是把這樣的非同步行為包成一個class讓我們只要繼承它就能達到這樣的效果.

而在Python裡面也有個 非同步的module叫做asyncore. 我們實作的socket只要繼承asyncore.dispatcher就能進行非同步的 socket運作.

下面就有Client和Server的範例code, 主要用途在於Client能連上Server, 然後Client和Server之間就能進行非同步的溝通, Client可以輸入訊息給Server, Server也能輸入訊息給Client.



Server 程式 :

# -*- coding: cp950 -*-

import socket
import asyncore
import threading

MAX_RECV = 4096

#負責接受client socket連線
class AgentServer(asyncore.dispatcher):   
   def __init__(self, port):
       #asyncore.dispatcher的constructor
       asyncore.dispatcher.__init__(self)
       #client socket
       self.clientSocket = None
       #server port
       self.port = port
       #建立等待的socket
       self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
       self.bind(('', self.port))
       self.listen(5)
  
   def handle_accept(self):
       #接受client socket的連線
       self.clientSocket, address = self.accept()
       print 'New client from : ' + address[0]
       #將和client連線的socket加上一些功能 (自訂socket)
       self.clientSocket = ClientAgent(self.clientSocket)

#自訂的client連線socket
class ClientAgent(asyncore.dispatcher):
   def __init__(self, socket):
       asyncore.dispatcher.__init__(self, socket)
       #要送出的data
       self.SendData = ""

   #從client收到的data
   def handle_read(self):
       self.RecvData = self.recv(MAX_RECV)
       if len(self.RecvData) > 0:
           print "recv : " + self.RecvData
   #送出data到client
   def handle_write(self):
       send_byte = self.send(self.SendData)
       #一次可能不會全部送完(一次最多送出512 bytes ?)
       if send_byte > 0:
           send_out = self.SendData[:send_byte]
           self.SendData = self.SendData[send_byte:]
           self.handle_write()
       else:
           print "send all!!"
           self.SendData = ""

   #不自動執行handle_write
   def writable(self):
       return False
  
   def handle_close(self):
       print "close connection : " + self.getpeername()[0]
       self.close()
#產生等待client連線的thread
class listen_client_thread(threading.Thread):
   def __init__(self,port):
       self.agentServer = AgentServer(port)
       threading.Thread.__init__ ( self )
      
   def run(self):
       print "Listen Client ..."
       asyncore.loop()
#產生處理輸入的thread       
class input_thread(threading.Thread):
   def __init__(self,listen_thread):
       self.listen_thread = listen_thread
       threading.Thread.__init__ ( self )
   def run(self):
       while 1:
           send_data = raw_input()
           self.listen_thread.agentServer.clientSocket.SendData = send_data
           self.listen_thread.agentServer.clientSocket.handle_write()

if __name__ == "__main__":
   #產生等待client連線的thread
   listen_thread = listen_client_thread(111)
   listen_thread.start()
   #產生處理輸入的thread
   input_thread(listen_thread).start()

Client 程式 :

# -*- coding: cp950 -*-

import asyncore, socket
import threading

#收到data最大長度
MAX_RECV = 4096

#連線server的socket
class client(asyncore.dispatcher):

   def __init__(self, host, port):
       asyncore.dispatcher.__init__(self)
       self.SendData = ""
       self.RecvData = ""
       #和server建立連線
       self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
       self.connect( (host, port) )

   def handle_connect(self):
       print 'connect!!'

   def handle_close(self):
       print "disconnection : " + self.getpeername()[0]
       self.close()

   #收到的data
   def handle_read(self):
       self.RecvData = self.recv(MAX_RECV)
       if len(self.RecvData) > 0:
           print "recv : " + self.RecvData

   #送出data
   def handle_write(self):
       send_byte = self.send(self.SendData)
       if send_byte > 0:
           send_out = self.SendData[:send_byte]
           self.SendData = self.SendData[send_byte:]
           print "send : " + send_out
           self.handle_write()
       else:
           print "send all!!"
           self.SendData = ""
   #自動偵測送出永遠失敗
   def writable(self):
       return False
  
#等待server傳送訊息的thread
class send_server_thread(threading.Thread):
   def __init__(self,host,port):
       self.client = client(host, port)
       threading.Thread.__init__ ( self )
   def run(self):
       try:
           asyncore.loop()
       except:
           pass
#等待user input的thread       
class input_thread(threading.Thread):
   def __init__(self,client_thread):
       self.client_thread = client_thread
       threading.Thread.__init__ ( self )
   def run(self):
       while 1:
           send_data = raw_input()
           self.client_thread.client.SendData = send_data
           self.client_thread.client.handle_write()

#主程式
if __name__ == "__main__":
   #建立和server連線, 並且等待溝通
   client_thread = send_server_thread("localhost",111)
   client_thread.start()
   #等待user input
   input_thread(client_thread).start()

AsyncSocket -Python异步Socket编程代码 Python异步Socket编程代码,对想学习python socket的人有用 立即下载

相关推荐

Python多线程Socket程序例子

NULL 博文链接:https://ghostfromheaven.iteye.com/blog/1305001

python模块介绍-asyncore 异步socket处理器

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34399060的博客 282

python实现简单socket通信的方法

主要介绍了python实现简单socket通信的方法,结合实例形式分析了socket通信服务端与客户端的具体实现技巧,需要的朋友可以参考下

Python asyncore socket客户端开发基本使用

asyncore库是python的一个标准库,提供了以异步的方式写入套接字服务的客户端和服务器的基础结构。操作网络的时候可以直接使用socket等底层的库,但是asyncore使得我们可以更加方便的操作网络,避免直接使用socket,select,poll等工具时需要面对的复杂情况。至此结束,本文章只做了一个基本使用讲解,可以查看借鉴使用,若想要做消息还差的很多。当有数据需要读取时(readable 回调函数返回True时),False表示没有数据需要被读取,当不实现默认返回True,

Free雅轩的博客 414

Python的Asyncore异步Socket模块及实现端口转发的例子

asyncore模块是封装过的处理socket事件的模块,采用异步的处理方式,这里我们讲来讲解Python的Asyncore异步Socket模块及实现端口转发的例子,需要的朋友可以参考下

Python网络编程使用select实现socket全双工异步通信功能示例

主要介绍了Python网络编程使用select实现socket全双工异步通信功能,简单说明了select模块的功能及socket全双工异步通信功能的相关实现技巧,需要的朋友可以参考下

python标准库 对socket二次封装_Python asyncore异步socket封装模块用法总结

http://50vip.com/316.htmlhttp://my.oschina.net/u/1433482/blog/190696在这里我先介绍一下与python中集成类库asyncore相关的内容。首先,可以看看python官网对于asyncore的解释(asyncore)。This module provides the basic infrastructure for writing ...

weixin_39858275的博客 292

Python基于select实现的socket服务器

本文实例讲述了Python基于select实现的socket服务器。分享给大家供大家参考,具体如下: 借鉴了asyncore模块中select.select的使用方法 import socket import traceback import select EOL1 = b'\n\n' EOL2 = b'\n\r\n' socketmap = {} r,w,e = [],[],[] response = b'HTTP/1.0 200 OK\r\nDate: Mon, 1 Jan 1996 01:01:01 GMT\r\n' response += b'Content-Type: text/p

asyncore模块

预备知识 asyncore模块 介绍 这个模块为异步socket的服务器通信提供简单的接口。该模块提供了异步socket服务客户端和服务器的基础架构。 相比python原生的socket api,asyncore具有很大的优势,asyncore对原生的socket进行封装,提供非常简洁优秀的接口,利用asyncore覆写相关需要处理的接口方法,就可以完成一个socket的网络编程,从而不需要处...

qq_45315982的博客 418

Python中asyncore的用法实例

本文实例讲述了python中asyncore模块的用法,分享给大家供大家参考。具体方法如下: 实例代码如下: ##asyncore import asyncore,socket ######################################################################## class AsyncGet(asyncore.dispatcher): """ the defined class """ #--------------------------------------------------------------

不用Root!这些隐藏代码能一键开启安卓诊断端口(小米/OPPO/魅族机型实测)

本文提供了一份无需Root权限即可开启安卓手机诊断端口的实用指南。通过拨号盘输入特定隐藏代码,小米、OPPO、魅族等机型的用户可以一键激活此工程模式,从而连接电脑进行基带数据备份(如QCN文件)或故障排查。文章详细列出了各品牌指令、操作验证步骤,并强调了备份IMEI等关键数据的重要性与操作风险,旨在帮助用户在紧急情况下修复网络问题。

weixin_29260291的博客 272

python异步模块 asyncore异步模块

asyncore即是一个异步的socket封装,特别是dispatcher类中包含了很多异步调用的socket操作方法。

TypicalSpider的博客 1182

告别Keil?在Mac上配置STM32CubeIDE + CMSIS-DAP调试器全攻略(含常见报错解决)

本文详细介绍了在Mac平台上配置STM32CubeIDE与CMSIS-DAP调试器的全流程,包括硬件准备、软件安装、工程创建及调试优化。通过实战指南,帮助开发者高效完成STM32开发,解决常见报错问题,提升开发效率。

weixin_30485379的博客 431

Python asyncore异步socket封装模块用法总结

Python asyncore异步socket封装模块用法总结

li_jiejun的专栏 3187

bcftools学习笔记(一)

欢迎关注"生信修炼手册"!本篇主要介绍index, view, query, sort, reheader这五个命令。1. indexindex命令用于对VCF文件建立索...

庐州月光的博客 6010

从零到一:海外短剧成品系统源码搭建流程详解及APP+H5交付服务

在当今全球化的数字娱乐浪潮中,海外短剧市场以其独特的文化魅力和广阔的受众基础,正逐渐成为内容创作者与平台运营者争相布局的新蓝海。我为了紧跟时代的发展我翻看了大量的文章,偶然间看到了一篇文章点进去发现他们是专业做短剧开发的,总结下来在这篇文章里分享给大家。

liangyill_的博客 907

asyncore基本介绍

一、asyncore框架的概念 asyncore模块是python自带的一个原生模块,提供简单的API以实现异步socket通信,并且为我们提供了异步socket服务器端和客户端的基础架构。 二、asyncore框架的原理 在使用asyncore框架时,需要注意两点: 全局函数loop 创建asyncore的事件循环 在事件循环中调用底层的select方法来检测特定的网络信道,如果...

nickyff的博客 1934

K8s入门教程(一)

本教程提供了Kubernetes(K8s)的入门指南,涵盖了从基础概念到实战操作的全面内容。首先介绍了Kubernetes的定义和核心功能,如自动化部署、弹性伸缩、自我修复等。接着,详细讲解了如何在macOS上安装Minikube和kubectl工具,以及如何使用这些工具创建和管理Pod、Deployment和Service等核心资源。教程还包括了实战案例,如部署Nginx应用,并介绍了高级特性如滚动更新和自动伸缩。最后,提供了常见问题的解决方案,帮助用户快速上手和解决实际使用中的问题。

2401_82505179的博客 1689

使用python内建asyncore编写socket client

本文通过python编写socket测试机器人

Abel's Blog 1495

光储微电网混合储能系统的控制策略

随着社会生产力的不断提高,对不可再生资源的大量消耗,人们已经意识到发展可再生能源的重要性,因此微电网技术作为再生能源利用的有效形式被快速发展。蓄电池容量无限大是传统光储微电网混合储能系统控制策略一种理想形式,但实际上蓄电池的容量是有限度的,传统控制策略在蓄电池剩余电量达到阖值时将无法正常使用,由此提出了光储微电网混合储能系统的新型控制策略,又结合实际情况,对开关进行了改进,利用开关与二极管并联,使其拥有四种工作状态,当储能元件剩余电量达到阈值时,可自动恢复电量降低成本,提高并输出电池电能质量。

nhkg888的博客 1732

基于 STM32 的乒乓球发球机控制系统设计与实现

乒乓球发球机是一种能够按照预设参数自动、连续发出乒乓球的训练设备。本系统以 STM32F103C8T6 为主控核心,通过控制实现球速调节、实现落点与旋转方向控制、实现出球节奏控制,并配合 OLED 显示与按键人机交互,实现速度、频率、落点、旋转四大参数的可调发球训练。

weixin_42300449的博客 209

Python asyncore socket客户端开发基本使用教程

asyncore库是python的一个标准库,提供了以异步的方式写入套接字服务的客户端和服务器的基础结构。操作网络的时候可以直接使用socket等底层的库,但是asyncore使得我们可以更加方便的操作网络,避免直接使用socket,select,poll等工具时需要面对的复杂情况。class SocketClient(asyncore.dispatcher):asyncore.dispatcher.__init__(self)self.create_socket()address = (host, por

源码客栈的博客 228

通俗易懂的Harris 角点检测

点击上方“3D视觉工坊”,选择“星标”干货第一时间送达Harris 角点检测 认为特征点具有局部差异性。如何描述“特征点具有局部差异性”:以每一个点为中心,取一个窗口,窗口大小为5*5...

3D视觉工坊 1473

Python asyncore模块-客户端

asyncore模块-客户端

yuyuyuliang00的博客 583

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: STL中map用法详解
下一篇: 利用Python获取系统当前时间
cppbegginer
博客等级 码龄18年 26粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值