2

即使服务器不接受我在客户端编写了以下功能的连接,我也在尝试从客户端到服务器端不断地通过时间

def run(self):

    print "running client"  
    start = datetime.now().second
    while True:
        try:
            host ='localhost'
            port = 5010
            time = abs(datetime.now().second-start)
            time = str(time)
            print time
            client = socket.socket()
            client.connect((host,port))
            client.send(time)

        except socket.error:
            pass 

现在我在另一个类中,它的名字是 loginGui,我想在线程的帮助下执行上面的全局函数运行,以便客户端在我的其余客户端代码执行时不断地将时间抛出到服务器端。所以我在类 loginGui 中编写了以下代码

class loginGui:
    def run_client(self):
            thread.start_new_thread(run,())

当我调用上述函数 run_client() 时,线程运行但由于某些原因它退出循环并停止浪费时间,所以我尝试了另一种方法..

class FuncThread(threading.Thread):

    def __init__(self, target, *args):
        self._target = target
        self._args = args
        threading.Thread.__init__(self)

    def run(self):
        self._target(*self._args)

我写了上面的类,然后在 run_client() 函数中我做了以下更改..

def run_client(self):

    t1 = FuncThread(run,())
    t1.start()
    t1.join()

现在,当我调用 run_client() 时,它会创建一个线程并调用全局函数 run() 但现在的问题是它在 while 循环中被击中并不断浪费时间。

结论:我基本上想要的是创建一个线程来调用我的函数运行并不断投入时间而不会陷入while循环..

4

1 回答 1

3

在您的第一个示例中,您的 while 循环以极快的未经检查的速度触发,一遍又一遍地创建未关闭的连接。您需要尝试在那里设置某种类型的限制,无论是睡眠还是类似的东西。尝试重用相同的客户端,而不是丢弃它们。您可能会遇到其他类型的异常,例如最终耗尽资源。如果您上次创建失败,您只需要尝试创建一个新客户端。不仅仅是每次您想发送另一位数据时。

在您的第二个示例中,您所做的几乎与以前相同,只是将代码移动到实际的线程类中,然后您调用join()which 将在主线程中阻塞,直到您的线程完成。

简而言之,我认为问题不在于您在哪里构建此线程类,而在于您如何以一种浪费的方式使用套接字连接。

这个例子有点难看,但我认为它会给你一个起点:

import time

def run(self):

    print "running client"  
    start = datetime.now().second
    host ='localhost'
    port = 5010

    client = None

    while True:

        if client is None:
            client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            try:
                client.connect((host,port))
            except socket.error:
                print "Connection failed. Retrying."
                client = None
                time.sleep(.25)
                continue


        time = str(abs(datetime.now().second-start))
        print time
        try:
            client.sendall(time)
        except:
            print "Send error."
            client.close()
            client = None

        time.sleep(.25)
于 2012-04-20T19:45:40.817 回答