2017-10-06 4 views
0

J'ai une implémentation serveur/client python socket. Le serveur lit les données de la file d'attente et les transmet au client.La file d'attente python lisant les mêmes données

Le client le lit et l'affiche. Lorsque j'exécute ce code, le client n'affiche que les 10 premières fois dans la file d'attente. aussi chaque fois les mêmes 10 fois sont envoyés au client.

Voici mes données dans le client.

Client2 received data: "test-msg---5", "test-msg---6", "test-msg---7", "test-msg---8", "test-msg---9"]["test-msg---0", "test-msg---1", "test-msg---2", "test-msg---3", "test-msg---4", "test-msg---5", "test-msg---6", "test-msg---7", "test-msg---8", "test-msg---9"]["test-msg---0", "test-msg---1", "test-msg---2", "test-msg---3", "test-msg---4", "test-msg---5", "test-msg---6", "test-msg---7", "test-msg---8", "test-msg---9"]["test-msg---0", "test-msg---1", "test-msg---2", "test-msg---3", "test-msg---4", "test-msg---5", "test-msg---6", "test-msg---7", "test-msg---8", "test-msg---9"]["test-msg---0", "test-msg---1", "test-msg---2", "test-msg---3", "test-msg---4", "test-msg---5", "test-msg---6", "test-msg---7", "test-msg---8", "test-msg---9"]["test-msg---0", "test-msg---1", "test-msg---2", "test-msg---3", "test-msg---4", "test-msg---5", "test-msg---6", "test-msg---7", "test-msg---8", "test-msg---9"]["test-msg---0", "test-msg---1", "test-msg---2", "test-msg---3", "test-msg---4", "test-msg---5", "test-msg---6", "test-msg---7", "test-msg---8", "test-msg---9"]["test-msg---0", "test-msg---1", "test-msg---2", "test-msg---3", "test-msg---4", "test-msg---5", "test-msg---6", "test-msg---7", "test-msg---8", "test-msg---9"]["test-msg---0", "test-msg---1", "test-msg---2", "test-msg---3", "test-msg---4", "test-msg---5", "test-msg---6", "test-msg---7", "test-msg---8", "test-msg---9"]["test-msg---0", "test-msg---1", "test-msg---2", "test-msg---3", "test-msg---4", "test-msg---5", "test-msg---6", "test-msg---7", "test-msg---8", "test-msg---9"]["test-msg---0", "test-msg---1", "test-msg---2", "test-msg---3", "test-msg---4", "test-msg---5", "test-msg---6", "test-msg---7", "test-msg---8", "test-msg---9"]["test-msg---0", "test-msg---1", "test-msg---2", "test-msg---3", "test-msg---4", "test-msg---5", "test-msg---6", "test-msg---7", "test-msg---8", "test-msg---9"]["test-msg---0", "test-msg---1", "test-msg---2", "test-msg---3", "test-msg---4", "test-msg---5", "test-msg---6", "test-msg---7", "test-msg---8", "test-msg---9"] 

Code Serveur: -

# server2.py 
import socket 
from threading import Thread 
from SocketServer import ThreadingMixIn 
import Queue 
import json 

TCP_IP = 'localhost' 
TCP_PORT = 9999 
BUFFER_SIZE = 1024 

q = Queue.Queue() 

for i in range(50000): 
    print 'put data' 
    q.put("test-msg---" + str(i)) 

def queue_get_all(q): 
    items = [] 
    maxItemsToRetreive = 10 
    for numOfItemsRetrieved in range(0, maxItemsToRetreive): 
     try: 
      if numOfItemsRetrieved == maxItemsToRetreive: 
       break 
      items.append(q.get_nowait()) 
     except Empty, e: 
      print 'Queue empty' 
    return items 

class ClientThread(Thread): 

    def __init__(self,ip,port,sock): 
     Thread.__init__(self) 
     self.ip = ip 
     self.port = port 
     self.sock = sock 
     print " New thread started for "+ip+":"+str(port) 

    def run(self): 
     # filename='mytext.txt' 
     # f = open(filename,'rb') 
     while True: 
      # l = f.read(BUFFER_SIZE) 
      l = queue_get_all(q) 
      while (l): 
       self.sock.sendall(json.dumps(l)) 
       #print('Sent ',repr(l)) 
       # l = f.read(BUFFER_SIZE) 
      if not l: 
       f.close() 
       self.sock.close() 
       break 

tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
tcpsock.bind((TCP_IP, TCP_PORT)) 
threads = [] 

while True: 
    tcpsock.listen(5) 
    print "Waiting for incoming connections..." 
    (conn, (ip,port)) = tcpsock.accept() 
    print 'Got connection from ', (ip,port) 
    newthread = ClientThread(ip,port,conn) 
    newthread.start() 
    threads.append(newthread) 

for t in threads: 
    t.join() 

code client

# Python TCP Client A 
import socket 

host = socket.gethostname() 
host = 'localhost' 
port = 9999 
BUFFER_SIZE = 2000 
MESSAGE = raw_input("tcpClientA: Enter message/ Enter exit:") 

tcpClientA = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
tcpClientA.connect((host, port)) 

while MESSAGE != 'exit': 
    # tcpClientA.send(MESSAGE)  
    data = tcpClientA.recv(BUFFER_SIZE) 
    print " Client2 received data:", data 
    MESSAGE = raw_input("tcpClientA: Enter message to continue/ Enter exit:") 

tcpClientA.close() 

Répondre

1

En run, vous appelez l = queue_get_all(q) puis vous entrez dans une boucle avec état while (l). Ensuite, vous ne réinitialisez jamais l. Donc, cela commence vrai (c'est-à-dire que la liste non vide est toujours évaluée à booléen vrai) et reste vraie pour toujours. Probablement que vous vouliez appeler queue_get_all à nouveau dans la boucle.

Je vous signale aussi que, après cette boucle, vous avez une if not l qui est superflu puisque la boucle ci-dessus va que sortie lorsque l est faux.