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

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-

    # 客户端
    import socket

    obj = socket.socket()
    obj.connect(("127.0.0.1", 8003))
    # 如果服务端不accept,阻塞
    content = str(obj.recv(1024), encoding="utf-8")
    print(content)
    obj.close()

    # 服务器端
    import socket
    import select

    sk1 = socket.socket()
    sk1.bind(("127.0.0.1", 8003))
    sk1.listen(5)
    inputs = [sk1, sk2, ]
    while True:
    r_list, w_list, e_list = select.select(inputs, [], [], 1)
    for sk in r_list:
    conn, address = sk.accept()
    conn.sendall(bytes("hello", encoding="utf-8"))
    conn.close()

    # send和sendall的区别是sendall里面有一个while循环会把要发送的所有信息都发送出去才返回
    # 但是send的话不一定全部发送,发送多少个字节就返回多少个字节
    # 程序从上到下执行,执行到select,用1s的时间去系统内核检查是否有发生变化,如果超时了,就出去了,就是执行
    # 到select,程序会等1s,如果在1s的时间内没有人来连,那么程序就会继续往下走,如果第0.5s有人来连接,那么
    # 程序就会直接往下走,1s是最多的等待时间
    #
    # 当客户端中止,会给服务端发空数据,select依然能够监听到 2.7
    # 3的话用try except

    # 服务器端

    import socket
    import select

    sk1 = socket.socket()
    sk1.bind(("127.0.0.1", 8003))
    sk1.listen(5)
    inputs = [sk1, ]
    outputs = []
    message_dict = {}
    while True:
    r_list, w_list, e_list = select.select(inputs, outputs, inputs, 1)
    for sk in r_list:
    if sk == sk1:
    conn, address = sk.accept()
    inputs.append(conn)
    message_dict[conn] = []
    else:
    try:
    data_bytes = sk.recv(1024)

    except Exception as e:
    inputs.remove(sk)
    else:
    data_str = str(data_bytes, encoding="utf-8")
    message_dict[sk].append(data_str)
    # sk.sendall(bytes(data_str + "hao", encoding="utf-8"))
    outputs.append(sk)
    for conn in w_list:
    recv_str = message_dict[conn][0]
    del message_dict[conn][0]
    conn.sendall(bytes(recv_str+"hello",encoding="utf-8"))
    outputs.remove(conn)


    # 无论是中止还是control+c,都能用try,except捕捉到
    # 如果接受到消息,执行else语句,如果接收不到消息,执行except语句
    # w_list保存的是给服务端发消息的客户端,然后你可以发消息给该客户端
    # message_dict这里可以用queue来优化
  • 相关阅读:
    水木清华小爬虫
    不让复制是不可能的----js获取选中文字
    [转]nonlocal和global
    LLVM和clang
    Megcup2017 Dogfood
    史莱姆自爆问题
    前端颜色表
    [转]论文十诫
    返利网盈利模式
    事务的四个属性ACID
  • 原文地址:https://www.cnblogs.com/liangweixiong/p/6418177.html
Copyright © 2011-2022 走看看