1. 使用协程完成server端和client端的通信
思路:
server端应该是一直等待连接的,来一个client端连接,就要开一个协程去执行server端与client端之间的通信;
# server.py from gevent import monkey; monkey.patch_all() import gevent import socket sk=socket.socket() sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) sk.bind(("127.0.0.1",8080)) sk.listen() def send_recv(conn): conn.send(bytes("hello,xuanxuan".encode("utf-8"))) ret=conn.recv(1024).decode("utf-8") print(ret) conn.close() while True: conn,addr=sk.accept() gevent.spawn(send_recv,conn) # server端等待连接,client端来连 server端就开启一个协程去执行通信 sk.close()
# client.py import socket sk=socket.socket() sk.connect(("127.0.0.1",8080)) ret=sk.recv(1024).decode("utf-8") print(ret) info=input(">>>") sk.send(bytes(info.encode("utf-8"))) sk.close()
运行结果:
改进版(加上while True比较好,可以和一个client一直通信,但是可以连接多个client):
# server.py from gevent import monkey; monkey.patch_all() import gevent import socket sk=socket.socket() sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) sk.bind(("127.0.0.1",8080)) sk.listen() def send_recv(conn): while True: info=input(">>>") conn.send(bytes(info.encode("utf-8"))) ret=conn.recv(1024).decode("utf-8") print(ret) conn.close() while True: conn,addr=sk.accept() gevent.spawn(send_recv,conn) # server端等待连接,client端来连 server端就开启一个协程去执行通信 sk.close()
#client.py import socket sk=socket.socket() sk.connect(("127.0.0.1",8080)) while True: ret=sk.recv(1024).decode("utf-8") print(ret) info=input(">>>") sk.send(bytes(info.encode("utf-8"))) sk.close()
版本三(开多个线执行客户端连接服务端的操作)
# server.py from gevent import monkey; monkey.patch_all() import gevent import socket sk=socket.socket() sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) sk.bind(("127.0.0.1",8080)) sk.listen() def send_recv(conn): while True: ret = conn.recv(5).decode("utf-8") print(ret) conn.send(bytes(ret.upper().encode("utf-8"))) conn.close() while True: conn,addr=sk.accept() gevent.spawn(send_recv,conn) # server端等待连接,client端来连 server端就开启一个协程去执行通信 sk.close()
# client.py import socket import threading # client端开多个线程 连接server(就不用一个client自己手动开多次) def my_client(): sk = socket.socket() sk.connect(("127.0.0.1", 8080)) while True: sk.send(bytes("hello".encode("utf-8"))) ret=sk.recv(1024).decode("utf-8") print(ret) sk.close() for i in range(500): t=threading.Thread(target=my_client) t.start()