zoukankan      html  css  js  c++  java
  • 用select模拟一个socket server成型版2

    1.字典队列测试

    import queue
    
    msg_dic={}
    msg_dic[1]=queue.Queue()
    msg_dic[1].put('hello')
    msg_dic[1].put('bob')
    print(msg_dic)
    

     运行结果:

    C:abccdxdddOldboypython-3.5.2-embed-amd64python.exe C:/abccdxddd/Oldboy/Py_Exercise/Day10/eee.py
    {1: <queue.Queue object at 0x00801630>}
    
    Process finished with exit code 0
    

     2. 服务器端代码:

    import select,socket,queue
    server=socket.socket()
    server.bind(('localhost',9000))
    server.listen(1024)
    server.setblocking(False)
    msg_dic={} #定义一个空字典
    inputs=[server,]
    #inputs=[server,conn,conn2]
    outputs=[]
    #outputs=[r1,]
    while True:
        readable,writeable,exceptional=select.select(inputs,outputs,inputs)
        print(readable,writeable,exceptional)
        for r in readable:
            if r is server:
                conn,addr=server.accept()
                print('来了个新链接',addr)
                inputs.append(conn)
                msg_dic[conn]=queue.Queue() #初始化一个队列,后面存要返回给客户端的数据。键值key:value=conn(键):queue.Queue(值)
            else: #r is conn/conn2...
                data=r.recv(1024)
                print('收到数据',data)
                msg_dic[r].put(data) #把要发的数据存在字典里面,等下次循环的时候发。
                outputs.append(r) #放入返回的链接队列里.往output里面放什么,那么下次循环就出什么。往output里面放的是conn2,那么出的就是conn2
                #r.send(data)
    
    
        for w in writeable: #要返回给客户端的链接列表,writeable里面存放的是r (conn,conn2)
            data_to_client=msg_dic[w].get()
            w.send(data_to_client) #返回给客户端源数据。这样收和发就分开了。
            outputs.remove(w) #确保下次循环的时候writeable不返回这个已经处理完的链接了。
    
        for e in exceptional: #这个链接已经断开了,出问题了,我就不再检测它了。
            if e in outputs:
                outputs.remove(e)
            inputs.remove(e)
            del msg_dic[e]
    

     客户端代码:

    import socket
    s=socket.socket()
    s.connect(('localhost',9000))
    while True:
        msg=bytes(input(">>:"),encoding='utf8')
        s.sendall(msg)
        data=s.recv(1024)
        print('Received',data)
    s.close()
    
  • 相关阅读:
    ElasticSearch关闭重启命令
    解决使用驱动器中的光盘之前需要将其格式化
    mac利用Synergy操作多台电脑
    一次真实的蓝屏分析 ntkrnlmp.exe
    JS字符串false转boolean
    启明星会议室预定系统更新日志-通用版
    利用Visual Studio 2013 开发微软云Windows Azure配置指南(针对中国大陆)
    利用Bootstrap+Avalonjs+EntityFramework 开发ASP.NET WebForm应用程序(上)
    启明星会议室系统与Office365集成说明
    jQuery中attr和prop方法的区别说明
  • 原文地址:https://www.cnblogs.com/momo8238/p/7388733.html
Copyright © 2011-2022 走看看