0

我有一个小型服务器 - 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)。

4

0 回答 0