Python socketシミュレーションクライアントは、クライアントの送信データに影響を及ぼさずにサービス側データを受信し続ける
2782 ワード
クライアントプログラム:client.py
サービス側のプログラムを書いて、クライアントプログラムserverをテストします.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()