zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Document
    Document
    Document
    Document
    Document
    Document
    Document
    Document
    C#中的委托是什么
    C# Lambda表达式Contains方法 like
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9800676.html
Copyright © 2011-2022 走看看