我有一个小型服务器 - Python 2.7 中的客户端应用程序客户端应该从服务器获取数据。这是 clint 的代码
def main(ThreadNmber):
queue = Queue.Queue(maxsize=25000)
try:
for i in range(ThreadNmber):
t = Downloader(queue)
t.daemon = True
t.start()
except Exception, e:
return 1
while 1:
s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Connecting'
s2.connect((HOST, PORT))
print 'Receiving data...'
data = s2.recv(99950)
s2.close()
if 'empty' in data:
time.sleep(300)
else:
for line in data.split('*'):
try:
a = line.split(' ')[0]
b = line.split(' ')[1]
c = line.split(' ')[2]
queue.put((a.rstrip(),b.rstrip(),c.rstrip()))
except:
pass
这是针对服务器的:
HOST = ''
PORT = 31337
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(5)
while 1:
tuple = ''
conn, addr = s.accept()
while 1:
try:
data = conn.recv(1024)
print str(addr)+' Said '+data
except:
conn.close()
break
if queue.qsize() > 20000:
x = 20000
else:
x = queue.qsize()
if x == 0:
tuple = "Queue empty, come back another time"
conn.sendall(tuple)
conn.close()
print str(addr)+' Said '+data+
break
for i in range(x):
a,b,c = queue.get()
tuple += a+' '+b+' '+c+'*'
try:
conn.sendall(tuple)
conn.close()
print str(addr)+' Said '+data+'. I served him well'
break
except:
conn.close()
break
我的问题是,客户端在 While 循环中工作时,第一次成功连接后,到第二次时,它只是手动“连接”,无法再次连接到服务器。
有趣的是,当我在不涉及任何工作的情况下与客户端进行测试时,只需获取数据并关闭,它就可以正常工作。
在客户端,我也在线程中做套接字工作。在做了一些测试后,我发现,当我把那部分剪掉时,例如没有其他套接字工作正在进行时,客户端工作正常,没有任何问题。
有什么想法会是什么问题?如果有人想知道为什么,我使用 sendall 是因为数据很大(大约 400-500kb)。