zoukankan      html  css  js  c++  java
  • 并发编程实战之并发下的socket套接字编程

    一、python单线程下实现多个socket并发

    1.1 服务端

    import sys
    # import socket
    import time
    import gevent
    from gevent import socket
    from gevent import monkey
    
    monkey.patch_all()
    
    
    # 类似于python中的黑魔法,把很多模块的阻塞的变成非阻塞的,比如socket中的rece和send都变
    # 为不阻塞了
    
    
    def server(port):
        s = socket.socket()
        s.bind(("127.0.0.1", port))
        s.listen(2000)
        while True:
            cli, add = s.accept()
            gevent.spawn(handle_request, cli)
            # 通过gevent的启动一个协程,把客户端的socket对象传进去
    
    
    def handle_request(s):
        try:
            while True:
                data = s.recv(1024)
                print("收到的信息:", str(data, encoding="utf-8"))
                s.send(data)
                if not data:
                    s.shutdown(socket.SHUT_WR)
                    # 把和客户端这个链接销毁
        except Exception as ex:
            print(ex)
        finally:
            s.close()
    
    
    if __name__ == '__main__':
        server(8000)
    

    1.2 客户端

    import socket
    import gevent
    import threading
    import multiprocessing
    '''
    ip_bind = ("127.0.0.1",8000)
    c = socket.socket()
    c.connect(ip_bind)
    while True:
        data = input("客户端:")
        c.send(bytes(data,encoding="utf-8"))
        data = c.recv(1024)
        print("服务端:",str(data,encoding="utf-8"))
     
    c.close()
    '''
    import socket
    import gevent
    ip_bind = ("127.0.0.1",8000)
    c = socket.socket()
    c.connect(ip_bind)
    def f(n):
        while True:
            # c.send(bytes(n,encoding="utf-8"))
            data = str(n)
            c.send(bytes(data,encoding="utf-8"))
            data = c.recv(1024)
            print("server:",str(data,encoding="utf-8"))
        c.close()
    x = []
    if __name__ == '__main__':
        l = []
        """
        多线程实现并发客户端
            for i in range(500):
             t = threading.Thread(target=f,args=[str(i),])
             t.start()
             l.append(t)
        for t in l:
             t.join()
     
        """
        # 多进程实现并发客户端
        for i in range(100):
            p = multiprocessing.Process(target=f,args=[i,])
            p.start()
            l.append(p)
        for p in l:
            p.join()
    
  • 相关阅读:
    MFC Windows 程序设计>WinMain 简单Windows程序 命令行编译
    AT3949 [AGC022D] Shopping 题解
    CF643D Bearish Fanpages 题解
    CF643C Levels and Regions 题解
    CF241E Flights 题解
    CF671C Ultimate Weirdness of an Array 题解
    CF1592F Alice and Recoloring 题解
    GYM 102452E 题解
    CF494C Helping People 题解
    P5556 圣剑护符
  • 原文地址:https://www.cnblogs.com/nickchen121/p/11143317.html
Copyright © 2011-2022 走看看