zoukankan      html  css  js  c++  java
  • 03网络编程从之异步服务器

    # 这里异步服务器的实现是借助于select,有关select模块在我上边的博客中有体现。
    # zen_utils也是我们自己写的一个脚本。也在上边的磨课中

    import select, zen_utils,queue,time

    def serve(listener,inpouts,outputs,message_queues):
    while inputs:
    print('等待开始第一个线程连接1111')
    # 开始select监听,对input_list中的服务器端的server开始进行监听
    # 一旦调用socket的send,recv函数,将会再次调用此模块
    # 这里监控三个参数,第一个返回的是可读的list, 第二个存储的是可写的list, 第三个存储的是错误信息的
    readable, writeable, errorinfo = select.select(inputs, outputs, inputs)
    # 这里判断的是有没有客户端进行连接。
    for s in readable:
    # 然后在进行判断是服务端触发的连接还是客户端触发的链接。
    if s is listener:
    # 接收的消息和客户端的IP端口
    print(s)
    connection, client_address = s.accept()
    print('client:', connection, client_address)
    # 设置为非阻塞模式。
    connection.setblocking(0)
    # 将客户端连接也加入到inputs监听列表中。
    inputs.append(connection)
    # 加入到要发送的消息队列中。
    message_queues[connection] = queue.Queue()
    else:
    # 这是客户端发送消息触发的请求。
    data = s.recv(1024)
    if data != b'?' and data != b'':
    print('客户端{}发送了{}消息', s.getpeername(), data.decode('utf-8'))
    # 将接收到的消息需要进行回复的答案。放到对应的消息队列中。
    print(zen_utils.aphorisms.get(data,b''))
    message_queues[s].put(zen_utils.aphorisms.get(data,b''))
    if s not in outputs:
    outputs.append(s)
    else:
    print("一个客户端断开了连接", client_address)
    # 输出端不在监听。
    if s in outputs:
    outputs.remove(s)
    # 输入端不再监听
    inputs.remove(s)
    # 关闭这个套接字。
    s.close()
    # 删除消息队列中的消息
    del message_queues[s]
    # 下边是处理输出。
    for s in writeable:
    try:
    message_queue = message_queues.get(s)
    sent_data = ''
    if message_queue is not None:
    # 如果消息队列为空,不阻塞
    sent_data = message_queue.get_nowait()
    else:
    # 这里触发的客户端关闭连接。
    print('客户端关闭连接')
    except queue.Empty:
    # 客户端发送完了消息。
    print('%s' % s.getpeername())
    outputs.remove(s)
    else:
    if sent_data != '':
    s.sendall(sent_data)
    else:
    print('客户端关闭连接')

    # 处理异常情况。
    for s in errorinfo:
    print('有一个异常客户端的连接', s.getpeername())
    inputs.remove(s)
    if s in outputs:
    outputs.remove(s)
    s.close()
    del message_queues[s]
    time.sleep(1)

    if __name__ == '__main__':
    address = zen_utils.parse_command_line('获取IP端口')
    listener = zen_utils.create_srv_socket(address)
    # 将定义好的一个套接字传入到列表中。
    inputs = [listener]
    # 处理要发送的数据。
    outputs = []
    # 要发送的数据
    message_queues = {}
    serve(listener,inputs,outputs,message_queues)


  • 相关阅读:
    PHP把下划线分隔命名的字符串与驼峰式命名互转
    Cocos2d-JS/Ajax用Protobuf与NodeJS/Java通信
    gulp 实现 js、css,img 合并和压缩
    转:入门Webpack,看这篇就够了
    微信开发教程:用户账号绑定到微信公众号的方法分享
    C#RSA算法实现+如何将公钥为XML格式转为PEM格式,给object-C使用
    php使用openssl进行Rsa长数据加密(117)解密(128) 和 DES 加密解密
    Windows下将nginx安装为服务运行
    转载:Centos7 从零编译配置Memcached
    转载:Centos7 从零编译Nginx+PHP+MySql 二
  • 原文地址:https://www.cnblogs.com/cong12586/p/14094069.html
Copyright © 2011-2022 走看看