一、asyncore模拟HTTPClient端
import asyncore
class HTTPClient(asyncore.dispatcher):
def __init__(self,host):
# 初始化父类
asyncore.dispatcher.__init__(self)
# 创建一个socket对象
self.create_socket()
# 连接服务器端
self.connect((host,80))
#发送优化
self.buffer = b'GET /HTTP/1.1\r\nHost: www.baidu.com\r\n\r\n'
def handle_connect(self):
print('服务器连接成功')
def handle_close(self):
print('服务器连接断开')
self.close()
def readable(self):
return True
def handle_read(self):
# 指定一次读取1024个字节,如果一次没有读完的话,那么事件循环会分多次把内容读完为止
print(self.recv(1024).decode())
def writable(self):
return (len(self.buffer)>0)
def handle_write(self):
sent = self.send(self.buffer)
self.buffer = self.buffer[sent:]
if __name__ == '__main__':
HTTPClient('www.baidu.com')
asyncore.loop()
二、asyncore模拟socket server
- .服务器端
import asyncore
'''
回声服务器:直接将客户端发送的消息原样返回给客户端
1.服务器端需要能够接收客户端的连接请求
2.服务器端需要能够读取到客户端发送的内容
3.服务器端需要能够发送内容到客户端
'''
class Echoserver(asyncore.dispatcher):
def __init__(self,host,port):
asyncore.dispatcher.__init__(self)
self.create_socket()
self.set_reuse_addr() #把服务器监听地址设置为可重用
self.bind((host,port))
self.listen(5)
def handle_accepted(self, sock, addr):
print('接收到了来自于{}的连接'.format(addr))
def handle_read(self):
data = self.recv(1024)
print('接收到数据:{}'.format(data.decode()))
if data:
self.send(data) #判断客户端发送的内容不为空则原样发回给客户端
if __name__ == '__main__':
Echoserver('localhost',6666)
asyncore.loop()
- 客户端
import socket
import threading
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('127.0.0.1',6666))
def receive(client):
while True:
data = client.recv(1024)
if data:
print(data.decode())
def send(client):
while True:
to_data = input("请输入要发送的内容:")
client.send(to_data.encode())
threading.Thread(target=receive,args=(client, )).start()
threading.Thread(target=send,args=(client, )).start()
-
运行结果
-
为什么作为socket server的时候,服务器的连接会自动断开
socket连接是用完即断,所以为了保持通信服务端必须在socket连接建立好之后立即创建一个新的dispatcher实例来保存这个socket连接对象,否则socket连接会被服务器端自动断开。 -
修改为:
def handle_accepted(self, sock, addr):
print('接收到了来自于{}的连接'.format(addr))
EchoHandler(sock)
class EchoHandler(asyncore.dispatcher):
def handle_read(self):
data = self.recv(1024)
print('接收到数据:{}'.format(data.decode()))
if data:
self.send(data) # 判断客户端发送的内容不为空则原样发回给客户端
- 运行结果