send file function
This commit is contained in:
80
test.py
Normal file
80
test.py
Normal file
@@ -0,0 +1,80 @@
|
||||
import time
|
||||
import threading
|
||||
import socket
|
||||
import queue
|
||||
import sys
|
||||
send_queue = queue.Queue()
|
||||
|
||||
def recv():
|
||||
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||
s.bind(('127.0.0.1', 3900))
|
||||
s.listen(39)
|
||||
while True:
|
||||
conn, addr = s.accept()
|
||||
thread = threading.Thread(target=process_connection, args=(conn, addr), daemon=True)
|
||||
thread.start()
|
||||
|
||||
def process_connection(conn, addr):
|
||||
while True:
|
||||
data = conn.recv(4096)
|
||||
if not data:
|
||||
conn.close()
|
||||
return
|
||||
check_data.queue.put(data)
|
||||
time.sleep(1)
|
||||
|
||||
class Check_data:
|
||||
def __init__(self):
|
||||
self.queue = queue.Queue()
|
||||
self.thread = threading.Thread(target=self.recv, args=(), daemon=True)
|
||||
self.thread.start()
|
||||
|
||||
def recv(self):
|
||||
while True:
|
||||
data = self.queue.get()
|
||||
s_print(data)
|
||||
|
||||
def send(size, c):
|
||||
data = c*size
|
||||
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
s.connect(('127.0.0.1', 3900))
|
||||
s_print('start sending %s' % c)
|
||||
|
||||
start_time = time.time()
|
||||
s.sendall(data)
|
||||
end_time = time.time()
|
||||
|
||||
s_print('Send %s finished, take %s' % (c, end_time - start_time))
|
||||
|
||||
def print_queue():
|
||||
while True:
|
||||
word = send_queue.get()
|
||||
print(word)
|
||||
|
||||
def s_print(data):
|
||||
send_queue.put(data)
|
||||
|
||||
check_data = Check_data()
|
||||
|
||||
time.sleep(1)
|
||||
|
||||
thread_print = threading.Thread(target=print_queue, args=(), daemon=True)
|
||||
thread_print.start()
|
||||
|
||||
|
||||
thread_recv = threading.Thread(target=recv, args=(), daemon=True)
|
||||
thread_recv.start()
|
||||
print('recv thread started')
|
||||
time.sleep(1)
|
||||
|
||||
thread_send_1 = threading.Thread(target=send, args=(100000000, b'1'), daemon=True)
|
||||
thread_send_2 = threading.Thread(target=send, args=(100000000, b'2'), daemon=True)
|
||||
|
||||
thread_send_1.start()
|
||||
thread_send_2.start()
|
||||
|
||||
input()
|
||||
sys.exit()
|
||||
|
||||
# 结论,多线程同时对一个socket.sendall()调用,会导致数据混乱
|
||||
Reference in New Issue
Block a user