0

私は小さなサーバーを持っています-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 を使用しています。

4

0 に答える 0