作者介绍:【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者
- 本文已收录于tornado框架从入门到实战专栏:《tornado框架从入门到实战》
- 热门专栏推荐:《Django框架从入门到实战》、《爬虫从入门到精通系列教程》、《爬虫高级》、《前端系列教程》、《tornado一条龙+一个完整版项目》。
- 本专栏面向广大程序猿,为的是大家都做到Python从入门到精通,同时穿插有很多很多习题,巩固学习。
- 订阅专栏后可私聊进一千多人Python全栈交流群(手把手教学,问题解答); 进群可领取Python全栈教程视频 + 多得数不过来的计算机书籍:基础、Web、爬虫、数据分析、可视化、机器学习、深度学习、人工智能、算法、面试题等。
- 加入我一起学习进步,一个人可以走的很快,一群人才能走的更远!
![]()
【tornado官方中文文档】
tornado是Python的web框架。
tornado和主流的web服务器框架有明显的区别:
它是非阻塞式服务器,而且速度非常快,得力于其非阻塞的方式和epoll的运用!
tornado可以每秒处理数以千计的连接(号称)!
两个常见的协议:
网络协议:
http协议:基于网络的超文本传输控制协议。
通信协议:
tcp
上面也说了tornado速度快的一大原因是得益于其非阻塞的方式,所以下面就通过这一点来说明:
# -*- coding: utf-8 -*-
"""
__author__ = 孤寒者
"""
import socket
# 1.服务器对象 socket.AF_INET:使用IPV4; socket.SOCK_STREAM:使用socket套接字。
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.绑定IP和端口号
server.bind(("127.0.0.1",8080))
# 3.监听 设置接收数
server.listen(128)
print('服务器开启', 8080)
# 4.处理连接
# accept()理解就是三次握手建立连接。
# accept是一个阻塞的方法(你不来我就不动!),等待连接,每建立一个连接就会创建一个单独的通道。
# conn:通道参数;addr:通道地址(客户端连接服务端的IP和端口号,这个客户端的端口号是随机生成的!)。
new_cli, addr = server.accept()
# 打印一下ip和端口号的类型
print('来自一个新的连接', addr, type(addr))
# 5.设置接收数据的大小
data = new_cli.recv(1024)
print(data)
# 6.关闭这个连接的通道
new_cli.close()
# 关闭整个服务器
server.close()
# -*- coding: utf-8 -*-
"""
__author__ = 孤寒者
"""
import socket
# 建立服务器对象 通过打印这个client服务器对象可知:默认使用的是IPV4,协议是TCP。
client=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 指定服务器的ip和端口号
client.connect(('127.0.0.1',8080))
# 发送数据给服务器
client.send(b'hello server')
# 指定发送给服务器的文件大小
data = client.recv(1024)
print(data)
import socket
import threading
def handle_func(new_sock):
while True:
data = new_sock.recv(4) # 接收数据
print(data)
if data is None:
break
new_sock.close()
while 1:
# 服务器对象 socket.AF_INET:使用IPV4; socket.SOCK_STREAM:创建一个socket套接字。
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定服务器
server.bind(("127.0.0.1", 8000))
# 监听
server.listen(128)
print('服务器开启', 8000)
# accept是一个阻塞的方法(你不来我就不动!),等待连接,每建立一个连接就会创建一个单独的通道。
# conn:通道参数;addr:通道地址(客户端连接服务端的IP和端口号,这个客户端的端口号是随机生成的!)。
new_cli, addr = server.accept()
# 打印一下ip的类型
print('来自一个新的连接', addr, type(addr))
server.setblocking(False) # 设置套接字为非阻塞 找epoll使用 解决网络的等待问题
# 注意:协程要依附于线程!
task = threading.Thread(target=handle_func, args=(new_cli,))
task.start()