加入链接循环和通信循环基于TCP协议的套接字编程
服务端
# socket是模块名
import socket
# from socket import  socket
# 第一个socket是模块名, 第二个socket是类名
# SOCK_STREAM => 基于TCP协议写的
# server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
# 不传就代表tcp协议
server = socket.socket()
# 绑定监听的地址
server.bind(('127.0.0.1', 8081))
# listen监听, 半连接池, 强调:可不是同时服务5个
server.listen(5)
# 接收消息
print("正在接收客户端消息:")
while True:
    # sock 当前连接对象  addr 客户端的地址 ip+port
    sock, addr = server.accept()
    print(sock)
    print(addr)
    # 1024 bytes
    while True:
        # 客户端非正常断开,需要捕捉异常
        try:
            data = sock.recv(1024)
            if len(data) == 0:  # 当客户端主动断开时,接收的数据为空
                break
            print(data)
            sock.send(data.upper())
        except Exception as e:
            print(e)
            break
    sock.close()
server.close()
客户端
# 客户端
import socket
client = socket.socket()
client.connect(('127.0.0.1', 8081))
while True:
    input_data = input('请输入要传输的数据:(q to quit)').strip()
    if not input_data:continue
    if input_data =='q':
        break
    client.send(input_data.encode('utf-8'))
    # 接收服务端返回的结果
    data = client.recv(1024)
    print(data)
client.close()
基于UDP协议的套接字编程
服务端
import  socket
# SOCK_DGRAM =》  udp服务端
# SOCK_STREAM =》 tcp服务端
server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1', 8080))
while True:
# client_addr: 客户端地址
    data, client_addr = server.recvfrom(1024)
    print(data)
    print(client_addr)
    server.sendto(data.upper(), client_addr)
server.close()
客户端
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 数据报协议-》UDP
while True:
    msg = input('>>: ').strip()  # msg=''
    client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8080))
    # 接收服务端返回的数据
    data, server_addr = client.recvfrom(1024)
    print(data)
client.close()
进程
进程的概念
    进程是系统进行资源分配和调度的基本单位
    程序和进程:
        程序是静态的,没有生命周期
        进程是动态的,是有生命周期的
    协程
    进程是操作系统分配资源的基本单位,线程是操作系统执行的最小单位
    进程不是实际干活的人,真正干活的是线程
    进程的三种状态:
        就绪态:
        运行态
        阻塞态