阻塞I/O模型(服务端):
from socket import *
server = socket(AF_INET, SOCK_STREAM)
server.bind(('127.0.0.1',8081))
server.listen(5)
while True:
conn, addr = server.accept()
print(addr)
while True:
try:
data=conn.recv(1024)
if not data:break
conn.send(data.upper())
except ConnectionResetError:
break
conn.close()
server.close()
阻塞I/O模型(客户端):
from socket import *
client = socket(AF_INET, SOCK_STREAM)
client.connect(('127.0.0.1',8081))
while True:
msg=input('>>: ').strip()
if not msg:continue
client.send(msg.encode('utf-8'))
data=client.recv(1024)
print(data.decode('utf-8'))
===================================================
非阻塞I/O模型(服务端):
1
对cpu的占用率过多,但是是无用的占用
2
在连接数过多的情况下,不能及时响应客户的的消息
from socket import *
import time
server = socket(AF_INET, SOCK_STREAM)
server.bind(('127.0.0.1',8083))
server.listen(5)
server.setblocking(False) #设置为False #accept,recv 默认True(阻塞型)
conn_l=[]
while True:
try:
conn, addr = server.accept()
conn_l.append(conn)
print(addr)
except BlockingIOError:
print('干其他活去了',len(conn_l))
# time.sleep(2)
del_l = []
for conn in conn_l:
try:
data=conn.recv(1024)
if not data:
conn.close()
del_l.append(conn)
continue
conn.send(data.upper())
except BlockingIOError:
pass
except ConnectionResetError:
conn.close()
del_l.append(conn)
for conn in del_l:
conn_l.remove(conn)
非阻塞I/O模型(客户端):
from socket import *
client = socket(AF_INET, SOCK_STREAM)
client.connect(('127.0.0.1',8083))
while True:
msg=input('>>: ').strip()
if not msg:continue
client.send(msg.encode('utf-8'))
data=client.recv(1024)
print(data.decode('utf-8'))
==============================================================
I/O多路复用(服务端):
from socket import *
import time
import select
server = socket(AF_INET, SOCK_STREAM)
server.bind(('127.0.0.1',8084))
server.listen(5)
server.setblocking(False)
read_l=[server,]
print('starting....')
while True:
rl,wl,xl=select.select(read_l,[],[]) #read_l=[server,conn1,conn2,conn3]
#rl=[server,conn2]
# print('===>',rl)
# print(rl[0] is server)
for r in rl:
if r is server:
conn,addr=rl[0].accept() #conn,addr=server.accpet()
print(addr)
read_l.append(conn)
# print(len(read_l))
else:
try:
data=r.recv(1024)
if not data:
r.close()
read_l.remove(r)
continue
r.send(data.upper())
except ConnectionResetError:
r.close()
read_l.remove(r)
I/O多路复用(客户端):
from socket import *
client = socket(AF_INET, SOCK_STREAM)
client.connect(('127.0.0.1',8084))
while True:
msg=input('>>: ').strip()
if not msg:continue
client.send(msg.encode('utf-8'))
data=client.recv(1024)
print(data.decode('utf-8'))
依然是你 --- 胡彦斌