• 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来优化
  • 相关阅读:
    [lab]csappattack
    [lab]csappbomb
    springboot 与 springcloud 的版本选型
    猜你喜欢推荐系统算法(笔记)
    java idea 自动生成单元测试模板
    RetryableException: Connection refused (Connection refused) executing POST http://ctsmessagecenter/.....
    git 学习整理
    echarts知识点汇总
    状态模式(C#)
    Ant Design of Vue select加载远程数据完善方案
  • 原文地址:https://www.cnblogs.com/liangweixiong/p/6418177.html
Copyright © 2020-2023  润新知