zoukankan      html  css  js  c++  java
  • python单线程下实现多个socket并发

    先看服务端的代码

    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)
    

     

    在看客户端的代码,分别使用多线程和多进程实现

    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()
    

      

  • 相关阅读:
    echarts x轴文字显示不全(解决方案)
    公共文件模块include
    个人tools封装
    echart改变legend样式及分页
    【学习笔记】tensorflow图片读取
    【学习笔记】tensorflow文件读取
    《简约之美:软件设计之道》总结
    【学习笔记】tensorflow队列和线程
    【学习笔记】tensorflow实现一个简单的线性回归
    【学习笔记】tensorflow基础
  • 原文地址:https://www.cnblogs.com/bainianminguo/p/7441907.html
Copyright © 2011-2022 走看看