python学习笔记 day40 使用协程实现socket通信(server---client通信)

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()
talk is cheap,show me the code
原文地址:https://www.cnblogs.com/xuanxuanlove/p/9800676.html