zoukankan      html  css  js  c++  java
  • 192 并发编程实战之并发下的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()
    
  • 相关阅读:
    h264 流、帧结构
    H264 帧结构分析、帧判断
    sigaction
    sigaction 用法实例
    sigaction函数的使用
    linux c 之signal 和sigaction区别
    linux 信号signal和sigaction理解
    Hamcrest使用
    Junit4中的新断言assertThat的使用方法
    Hamcrest Tutorial
  • 原文地址:https://www.cnblogs.com/abdm-989/p/11954567.html
Copyright © 2011-2022 走看看