socket多并发
socket可以实现单个客户端进行请求访问,它可以通过 socketserver来实现并发功能呢,socketserver是通过 启用多线程实现并发,在这里我们也可以通过gevent协程 来实现单个线程下的多并发。
socket server:
import gevent
from gevent import socket,monkey
monkey.patch_all()
def server(port):
s = socket.socket()
s.bind(('0.0.0.0', port))
s.listen(500)
while True:
cli, addr = s.accept()
# socket会创建一个线程链接,这里会交给协程处理
# 链接后通过gevent启动一个协程
# 接收一个函数,与链接实例参数
gevent.spawn(handle_request, cli)
# 所有交互都由handle处理
def handle_request(conn):
try:
while True:
data = conn.recv(1024)
print("recv:", data)
conn.send(data)
if not data:
# 如果没有数据就关闭Client端
conn.shutdown(socket.SHUT_WR)
# 如果出现异常就打印异常
except Exception as ex:
print(ex)
# 最后中断实例的conn
finally:
conn.close()
if __name__ == '__main__':
server(8001)
socket client(多次开启,测试访问):
import socket
# 链接服务端
HOST = 'localhost' # The remote host
PORT = 8001 # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
# 数据请求
while True:
msg = bytes(input(">>:"),encoding="utf8")
s.sendall(msg)
data = s.recv(1024)
#print(data)
# repr格式化输出
print('Received', repr(data))
s.close()