zoukankan      html  css  js  c++  java
  • day9 IO多路复用

    参考:http://www.cnblogs.com/wupeiqi/articles/5040823.html

    SocketServer内部使用 IO多路复用 以及 “多线程” 和 “多进程” ,从而实现并发处理多个客户端请求的Socket服务端。即:每个客户端请求连接到服务器时,Socket服务端都会在服务器是创建一个“线程”或者“进程” 专门负责处理当前客户端的所有请求。

    IO多路复用server端:

    import socket
    import select
    
    # IO多路复用:8002,8001
    #
    ############################### 基于select实现服务端的“伪”并发 ###############################
    sk1 = socket.socket()
    sk1.bind(('127.0.0.1',8001,))
    sk1.listen(5)
    
    sk2 = socket.socket()
    sk2.bind(('127.0.0.1',8002,))
    sk2.listen(5)
    inputs = [sk1,sk2,]
    w_inputs = []
    while True:
        # IO多路复用,同时监听多个socket对象
        #    - select,内部进行循环操作(1024)  主动查看
        #    - poll, 内部进行循环操作         主动查看
        #    - epoll,                        被动告知
        r,w,e = select.select(inputs,w_inputs,inputs,0.05)
        # r = [sk2,]
        # r = [sk1,]
        # r = [sk1,sk2]
        # r = []
        # r = [conn,]
        # r = [sk1,Wconn]
        #######?
        for obj in r:
            if obj in [sk1,sk2]:
                # 新连接捡来了...
                print('新连接来了:',obj)
                conn,addr = obj.accept()
                inputs.append(conn)
            else:
                # 有连接用户发送消息来了..
                print('有用户发送数据了:',obj)
                try:
                    data = obj.recv(1024)
                except Exception as ex:
                    data = ""
                if data:
                    w_inputs.append(obj)
                    # obj.sendall(data)
                else:
                    obj.close()
                    inputs.remove(obj)
                    w_inputs.remove(obj)
    
        for obj in w:
            obj.sendall(b'ok')
            w_inputs.remove(obj)

    client 端1:

    import socket
    
    client = socket.socket()
    client.connect(('127.0.0.1',8001,))
    
    while True:
        v = input('>>>')
        client.sendall(bytes(v,encoding='utf-8'))
        ret = client.recv(1024)
        print('服务器返回:',ret)

    client 端2:

    import socket
    
    client = socket.socket()
    client.connect(('127.0.0.1',8002,))
    
    while True:
        v = input('>>>')
        client.sendall(bytes(v,encoding='utf-8'))
        ret = client.recv(1024)
        print('服务器返回:',ret)
  • 相关阅读:
    使用 git 及 github
    layUi数据表格自动渲染
    Linux下Tomcat重新启动 和查看日志
    禁止页面后退js(兼容各浏览器)
    通俗讲解计算机网络五层协议
    浏览器与服务器交互的过程
    转载 为什么会有前后端分离
    Kubernetes & Docker 容器网络终极之战(十四)
    Kubernetes 配置管理 Dashboard(十三)
    Kubernetes 配置管理 ConfigMap(十二)
  • 原文地址:https://www.cnblogs.com/liyongshan/p/8677827.html
Copyright © 2011-2022 走看看