预备知识

asyncore模块

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

搭建服务器环境

#在终端中输入
nc -l 9000
#在另外开一个终端输入这就建立了一个socket
talent 127.0.0.1 9000

客户端socket 开发基本使用

socket客户端主流程:

import asyncore
#1.定义类并继承自 asyncore.dispatcher

class SocketClient(asyncore.dispatcher):
    #2.实现类中的回调代码
    def  __init__(self,host,port):
        #调用父类方法
        asyncore.dispatcher.__init__(self)
        #创建socket对象
        self.create_socket()
        #链接服务器
        address=(host,port)
        self.connect(address)
        pass
    
#3.创建对象并执行  asyncore.loop  进入运行循环

if __name__ == '__main__':
    client=SocketClient('127.0.0.1',9000)
    #开始启动运行循环
    asyncore.loop(timeout=5)

其他回调函数:
实现连接回调函数 handle_connect 回调函数
当Socket连接服务器成功时回调该函数

def handle_connect(self):
        print("连接成功")

实现writable回调函数
描述是否有数据需要被发送到服务器。返回值为True 表示可写,Flase 表示不可写,如果不实现默认返回为True ,当返回为True 时,回调函数 handle_write被触发。

def writable(self):
        return True

实现handle_write回调函数
当有数据需要发送时(writable 回调函数返回True时),该函数被触发,通常情况下在该函数中编写send方法发送数据。

# 实现handle_write回调函数
    def  handle_write(self):
        #内部实现对服务器发送数据的代码
        #调用send方法发送数据,参数是字节数据
        self.send("hello ".encode('utf-8'))

实现readable回调函数
描述是否有数据从服务端读取。返回True表示有数据需要读取,Flase表示没有数据需要被读取,当不实现默认返回为True,当返回为True时,回调函数 handle_read将被触发。

def  readable(self):
        return True

实现 handle_read 回调函数

def handle_read(self):
        #主动接收数据,参数是需要接收数据的长度
        result=self.recv(1024)
        print(result)

实现handle_error 回调函数
当程序运行发生异常时回调该函数

def handle_error(self):
        #编写处理错误的方法
        t,e,trace=sys.exc_info()
        print(e)

实现 handle_close 回调函数
当连接关闭时被触发

def handle_close(self):
        print("连接关闭")
        #主动调用关闭函数
        self.close()

全部asyncore代码:

import asyncore
import sys
#1.定义类并继承自 asyncore.dispatcher

class SocketClient(asyncore.dispatcher):
    #2.实现类中的回调代码
    def  __init__(self,host,port):
        #调用父类方法
        asyncore.dispatcher.__init__(self)
        #创建socket对象
        self.create_socket()
        #链接服务器
        address=(host,port)
        self.connect(address)
        pass

    #实现handle_connect回调函数
    def handle_connect(self):
        print("连接成功")

    # 实现writable回调函数
    def writable(self):
        return False

    # 实现handle_write回调函数
    def  handle_write(self):
        #内部实现对服务器发送数据的代码
        #调用send方法发送数据,参数是字节数据
        self.send("hello ".encode('utf-8'))
    #实现readable回调函数
    def  readable(self):
        return True
    #实现handle_read回调函数
    def handle_read(self):
        #主动接收数据,参数是需要接收数据的长度
        result=self.recv(1024)
        print(result)
    #实现handle_error回调函数
    def handle_error(self):
        #编写处理错误的方法
        t,e,trace=sys.exc_info()
        print(e)
    #实现 handle_close回调函数
    def handle_close(self):
        print("连接关闭")
        #主动调用关闭函数
        self.close()

#3.创建对象并执行  asyncore.loop  进入运行循环

if __name__ == '__main__':
    client=SocketClient('127.0.0.1',9000)
    #开始启动运行循环
    asyncore.loop(timeout=5)