zoukankan      html  css  js  c++  java
  • 状态集合[Python]Socket高级 select I/O复用模型(二)

    废话就不多说了,开始。。。

        代码: 

        客户端:

    #!/usr/bin/env python
    #coding:utf8  
    #python2.73 lession7_1_s.py
    """
    这是一个多客户端 用来测试 
    有5个用户  7个息消 一共发送35次 
    """
    
    import socket
    from time import sleep
    
    
    msg = ['cs111','cs222','cs333','cs444','cs555','cs666','cs777']
    
    ss = [] #客户端集合
    
    saddr = ('localhost',30001)
    for i in range(5):
        s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        ss.append(s)
    
    for s in ss:
        s.connect(saddr)
    
    counts = 0
    for m in msg:
        for s in ss:
            #向服务端发送信息
            s.send("client num: %s meg: %s"%(counts,m))
            counts+=1
            
        for s in ss:
            #从服务端取得回返信息
            data = s.recv(1024)
            print "%s echo %s"%(s.getpeername(),data)
            if not data:
                s.close()

        服务端:

        每日一道理
    时间好比一条小溪,它能招引我们奔向生活的海洋;时间如同一叶扁舟,它将帮助我们驶向理想的彼岸;时间犹如一支画笔,它会指点我们描绘人生的画卷。
    #!/usr/bin/env python
    #coding:utf8  
    #python2.73 lession7_1_s.py
    import socket
    import select
    import Queue
    
    saddr = ('localhost',30001)
    sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    sock.setblocking(False) #设置socket长短阻塞的
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind(saddr)#定绑地址
    sock.listen(10)
    #conn,addr = s.accept()
    rlists = [sock] #select参数 可写状态集合
    wlists = [] #select参数 可读状态集合
    
    msg_que = {}
    timeout = 20 
    #print 'connented with addr:',addr 
    
    while rlists:
        rs,ws,es = select.select(rlists, wlists, rlists, timeout)
        if not (rs or ws or es):
            print 'timeout...'
            continue
        #大体路思就是对有所的回返组停止环循 查看状态作出作动
        for s in rs:
            if s is sock:   #否是是服务端的sock 
                conn,addr = s.accept()
                print 'connect by',addr
                conn.setblocking(False)
                rlists.append(conn)
                msg_que[conn] = Queue.Queue()
            else:                       #客户段的sock接受据数
                data = s.recv(1024)
                if data:
                    print data 
                    msg_que[s].put(data)
                    if s not in wlists:
                        wlists.append(s)
                else:
                    if s in wlists:
                        wlists.remove(s)
                    rlists.remove(s)
                    s.close()
                    del msg_que[s]
                    
        for s in ws:
            try:
                msg = msg_que[s].get_nowait()
            except Queue.Empty:
                print 'msg empty'
                wlists.remove(s)
            else:
                s.send(msg)
        
        for s in es:
            print 'except ',s.getpeername()
            if s in rlists:
                rlists.remove(s)
            if s in wlists:
                wlists.remove(s)
            s.close()
            del msg_que[s]

    文章结束给大家分享下程序员的一些笑话语录: 关于编程语言
    如果 C++是一把锤子的话,那么编程就会变成大手指头。
    如果你找了一百万只猴子来敲打一百万个键盘,那么会有一只猴子会敲出一 段 Java 程序,而其余的只会敲出 Perl 程序。
    一阵急促的敲门声,“谁啊!”,过了 5 分钟,门外传来“Java”。
    如果说 Java 很不错是因为它可以运行在所有的操作系统上,那么就可以说 肛交很不错,因为其可以使用于所有的性别上。

  • 相关阅读:
    02.替换空格 (Java)
    01.二维数组中的查找 (Java)
    css
    CSS Selectors
    Golang Singleton
    TL;DR
    go get
    golang string、int、int64 float 互相转换
    Thrift支持的基本数据类型
    双亲委派模型
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3038733.html
Copyright © 2011-2022 走看看