预备知识
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)