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()
    
  • 相关阅读:
    .Net 4.5中的HttpClient试用
    在silverlight中使用微软地图
    SQL语句之语法汇总(一)
    如何将google地图中的经纬度值导入ArcMap
    毕业周年季
    SQL语句之语法汇总(二)
    定时出现和消失的层
    实现iFrame自适应高度,原来很简单!
    .Net 中的反射(查看基本类型信息) Part.2
    反射一些文章
  • 原文地址:https://www.cnblogs.com/nickchen121/p/11143317.html
Copyright © 2011-2022 走看看