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来优化
  • 相关阅读:
    onload执行顺序
    让EXCHANGE可以接收外部邮件服务器发送的邮件
    QQ网站里AppTui对象脚本
    owa2007写新邮件时已经选择人员不能带入到与通讯录选人界面问题解决方法
    qq网站里动态加载脚本的实现
    qq网站里对元素的操作方法
    让Exchange可以发送邮件到互联网的邮件服务器
    js实现的hashtable
    无线网卡共享网络发射
    css省略号效果
  • 原文地址:https://www.cnblogs.com/liangweixiong/p/6418177.html
Copyright © 2011-2022 走看看