Python socketシミュレーションクライアントは、クライアントの送信データに影響を及ぼさずにサービス側データを受信し続ける

2782 ワード

クライアントプログラム:client.py
# -*- coding: utf-8 -*-
import socket
improt select
import threading
from time import sleep

def start_client():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect(('127.0.0.1', 8000))
    #      ,     socket close ,     recv      
    socket_lock = threading.Lock()

    def read_thread_method():
        while True: 
            if not sock:  #   socket  ,  
                break
            #   select     (                 ,       )
            #               ,      ,          socket ok
            #               ,
            #                ,
            #              ,      。         ,              select   ,       
            #                   ,     ,      
            rs, _, _ = select.select([sock], [], [], 10)
            for r in rs:  #           ,            
                socket_lock.acquire()  #         ,  socket  (sock             ,   sock          sock ,      sock    )

                if not sock:  #        ,      select      socket    
                    socket_lock.release()
                    break

                data = r.recv(1024)  #    ,       

                socket_lock.release()  #         ,    

                if not data:
                    print 'server close'
                else:
                    print data

    #            
    read_thread = threading.Thread(target=read_thread_method)
    read_thread.setDaemon(True)
    read_thread.start()

    #        
    for x in range(10):
        print x
        sock.send('hello')
        sleep(.1)  #   CPU  ,          

    #   socket,    ,         
    socket_lock.acquire()
    sock.close()
    sock = None
    socket_lock.release()

if __name__ == "__main__":
    start_client()

サービス側のプログラムを書いて、クライアントプログラムserverをテストします.py
# -*- coding: utf-8 -*-
import socket
import select

def start_server():
    server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_sock.bind("127.0.0.1", 8000)
    server_sock.listen(2)
    read_inputs = [s_handler, ]

    while True:
        print "waiting for connection..."
        rs, _, _ = select.select(read_inputs, [], [], 10)
        print 'receive new: %r %r' % (rs, read_inputs)
        for r_handler in rs:
            if r_handler is s_handler:
                c_socket, c_address = r_handler.accept()
                read_inputs.append(c_socket)
            else:
                data = r_handler.recv(1024)
                if not data:
                    read_inputs.remove(r_handler)
                else:
                    r_handler.send('demo')
                    print data

if __name__ == "__main__":
    start_server()