# -*- coding: utf-8 -*-
# 服务器端代码
import socket
import gevent
from gevent import monkey
monkey.patch_all()
def serve(conn):
while True:
try:
data = conn.recv(1024)
if not data: break
conn.send(data.upper())
except ConnectionResetError:
print(ConnectionResetError)
break
conn.close()
def server(IP, port, backlog=5):
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((IP, port))
server.listen(backlog)
print('server is listening ...')
while True:
conn, addr = server.accept()
# 阻塞,一旦阻塞开始切换到协程中的其他任务执行
gevent.spawn(serve, conn)
# gevent make lightweight execution units based on greenlets,
# execute the spawn method to spawn a unit with func addr(serve) and args(conn)
# just do the func with args, and recognize IO tasks, do task by coroutine method, serve(conn)
if __name__ == '__main__':
IP = '127.0.0.1'
port = 8080
g = gevent.spawn(server, IP, port)
g.join()
import socket
from threading import Thread,current_thread
IP = '127.0.0.1'
port = 8080
def solution():
# 客户端通信管道的生成必须放在函数体内部,否则只是单线程的反复连接
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((IP,port))
while True:
msg = f"{current_thread().name} say hello {current_thread()}"
client.send(msg.encode('utf-8'))
data = client.recv(1024)
print(data.decode('utf-8'))
if __name__ == '__main__':
threads = [Thread(target=solution) for i in range(50)]
for i in threads:
i.start()