单进程_非阻塞并发服务器
多线程代表:IIS服务器
多进程代表: Apache服务器
子线程共享主线程的变量,所以主线程中不能关闭new_socket.close(),否则子线程也会断开连接
上代码:
from socket import *
def main():
# 创建对象
tcp_server = socket(AF_INET, SOCK_STREAM)
# 绑定地址
tcp_server.bind(('', 8888))
# 将主动模式设置为被动模式
tcp_server.listen(5)
# 设置为非阻塞模式
tcp_server.setblocking(False)
input_server = [tcp_server]
while True:
for tcp_socket in input_server:
# 当为初始对象时,创建新的连接对象
if tcp_socket == tcp_server:
try:
# 创建新的连接对象
new_socket, client_info = tcp_socket.accept()
# 设置为非阻塞模式
new_socket.setblocking(False)
# 将新的对象添加至列表
input_server.append(new_socket)
except:
pass
else:
print(f'来自:{client_info[0]} 连接成功')
else:
try:
# 接收数据
raw_data = tcp_socket.recv(1024)
if raw_data:
print(f'接收到数据:{raw_data.decode("gb2312")}')
else:
print('客户端已断开!')
# 关闭连接
tcp_socket.close()
# 移除列表中
input_server.remove(tcp_socket)
except:
pass
if __name__ == '__main__':
main()
效果: 多个客户端访问服务端时,互不影响,可通知进行通讯。
阻塞型: 同一时刻只能有一个进行通讯,其他的的连接将以排队方式进行阻塞。