私は小さなサーバーを持っています-Python 2.7のクライアントアプリケーション クライアントはサーバーからデータを取得することになっています。これがクリントのコードです
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ループで作業しているときに、最初に正常に接続した後、2回目に到達したときに「接続中」を手渡し、サーバーに再び接続できないことです。
面白いことに、何の作業もせずにクライアントでテストしているときに、データを取得して閉じるだけで問題なく動作します。
クライアント側では、スレッドでソケット作業も行っています。いくつかのテストを行った後、その部分を切り取ると、たとえば他のソケット作業が行われていない場合、クライアントは問題なく動作することがわかりました。
問題が何であるかについて何か考えはありますか?データが大きい (約 400-500kb) ため、誰かが理由を知りたい場合は sendall を使用しています。