我有一个python套接字服务器/客户端实现。服务器从队列中读取数据并将数据推送到客户端。
客户端读取并显示它。当我运行此代码时,客户端始终只显示队列中的前10次。每次同样的10次发送给客户时也是如此。
这是我在客户端的数据。
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"]
服务器代码: -
# 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()
客户端代码
# 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()
答案 0 :(得分:1)
在run
,您拨打l = queue_get_all(q)
,然后输入条件为while (l)
的循环。然后你永远不会重置l
。所以它开始为真(即非空列表始终计算为布尔值true)并永远保持为真。可能你打算在循环内再次调用queue_get_all
。
我还提到,在该循环之后,您有一个if not l
,这是多余的,因为当l
为false时,上述循环将仅退出。