Python之Socket网编之前已经聊过了,这里不想过多赘述.复习的话可以跳转之前的学习界面

这里主要说一下遗忘的点

  • 多线程的创建时机
  • 服务端的套接字会在什么时候阻塞
  • 服务端套接字.accept()接收到的是什么东西

Answer

回答一下上面的问题:

  • 多线程应该放到死循环中创建,例如while True, 因为一台服务器要维护多个与客户端的连接,将
    • sock, addr = server.accept()和threading.Thread(target=xxx, args=(socket_io,)).start()放到一起,每当出现新的客户端连接就创建一个线程
  • 什么时候阻塞: 比如服务端创建了一个套接字: server = socket.socket()会在两个地方阻塞
    • socket_io, address = server.accept()这里等待客户端连接会阻塞
    • bytes_data = socket_io.recv(1024)等待客户端发送数据的时候也会阻塞
  • socket_io, address = server.accept()会接收到的东西为
    • 一个连接管道(set集合形式) socket_io
      • <socket.socket fd=696, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=(‘127.0.0.1’, 8000), raddr=(‘127.0.0.1’, 59815)>
    • 一个客户端的ip地址(元组形式)和浏览器端口号 address
      • <class ‘tuple’>: (‘127.0.0.1’, 59815)

Socket多线程

多线程和多进程不是第一次接触了, 实用场景也很多,这里和Socket结合实现一台服务器和多客户端通信.

  • 导包进程(import multiprocessing)/线程(import threading)
  • 创建线程 threading.Thread(target=x’x’x, args=(socket_io,)).start()

Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import socket
import json
import threading

def chat(socket_io):
while True:
# 等待客户端发送数据(阻塞)
bytes_data = socket_io.recv(1024)
print(bytes_data.decode())

info = input('输入对客户端的话: ')
if info == 'exit':
break
socket_io.send(info.encode())
# 关闭通道
socket_io.close()
if __name__ == '__main__':
# 创建服务端套接字
server_socket = socket.socket()
# 将服务端套接字绑定到指定的ip和端口
server_socket.bind(("localhost", 8000))
# 设置监听, 最大连接个数为128
server_socket.listen(128)
while True:
# 获取和客户端的通道, 以及对方的ip, 阻塞等待客户端连接
socket_io, address = server_socket.accept()
# 开启多线程调用函数去聊天
threading.Thread(target=chat, args=(socket_io,)).start()

FastAPI框架

什么是FastAPI?

简单讲FastAPI就是把做web开发所需的相关代码全部简化, 我们不需要自己实现各种复杂的代码, 例如多任务,路由装饰器等等. 只需要调用FastAPI提供给我们的函数, 一调用就可以实现之前需要很多复杂代码才能实现的功能.

FastAPI的特点

  • 性能快:高性能,可以和NodeJSGo相提并论
  • 快速开发:开发功能速度提高约200%至300%
  • 更少的Bug
  • Fewer bugs: 减少40%开发人员容易引发的错误
  • 直观:完美的编辑支持
  • 简单: 易于使用和学习,减少阅读文档的时间
  • 代码简洁:很大程度上减少代码重复。每个参数可以声明多个功能,减少bug的发生
  • 标准化:基于并完全兼容API的开发标准:OpenAPI(以前称为Swagger)和JSON Schema

FastAPI安装

  • 安装方式1:

    • 安装fastapi
      • pip install fastapi
    • 如果用于生产,那么你还需要一个ASGI服务器,如Uvicorn或Hypercorn
      • pip install uvicorn
  • 安装方式2 :

    选择File->Settings->解释器(直接选择阿里镜像源/清华镜像源)

FastAPI使用

ImportError: cannot import name Deque

写完程序一跑,Python不讲码德给我报错了,欺负我这个Python3.6低版本的编译器是吧, 升级,给我升到3.8.

  • 解释: 这个Deque的错误是由于FastAPI需要3.7以上的Python解释器,而我之前大学用的是3.6的,版本有点老了.

Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
mport uvicorn
from fastapi import FastAPI
#初始化 FastAPI 框架
from fastapi import Response

app = FastAPI()


#编写函数--处理浏览器请求(当客户端请求login.html页面的时候就返回下面的打开文件)
@app.get("/login.html")
def login():
# 打开文件
file = open("login.html",encoding='utf-8')
# 读取文件内容
str_data = file.read()
# 将文件内容以html的形式,当客户端通过get请求指定路径的时候就返回如下内容
return Response(content=str_data,media_type='text/html')

#编写函数--处理浏览器请求
@app.get("/regist.html")
def regist():
file = open("regist.html",encoding='utf-8')
str_data = file.read()
return Response(content=str_data,media_type='text/html')


#启动服务器,绑定端口
uvicorn.run(app,host='127.0.0.1',port=8000)