PyQt和TCP/IP

2024-04-25 13:33:59 发布

您现在位置:Python中文网/ 问答频道 /正文

好的,我有一个非常简单的回合制应用程序(游戏)。在

每个用户在服务器上发送一个请求,然后等待响应。重要的是,只有一个用户在服务器上发出请求(发送他的操作),而所有其他用户都在等待,如果服务器向他们发送一些数据,那么他们必须始终检查(循环)是否有来自服务器的内容。在

我使用python“socket”的内置模块,我管理客户机的方式是这样的:为每个用户创建一个线程,在该线程中运行无限循环,直到应用程序结束,该线程检查请求(如果轮到用户)或检查它是否有任何东西要发送给其他用户。现在我们来谈谈客户。每个客户机又有一个线程具有无限循环,等待来自服务器的数据。在

问题是GUI是用PyQt4.4制作的,在这里我无法进入PyQt本身的循环(尽管我已经看到,使用twisted是可能的,但是我必须重写代码),所以我必须使用线程,这意味着我可以使用经典的python线程库或QThread,但遗憾的是,QThread没有任何事件,这是非常重要的,因为我希望总是在收到来自服务器的消息之后等待程序的响应,这样我就可以再次向服务器发送响应。另一方面,我不确定是否可以使用线程中的线程来发出信号。那么哪一个才是正确的选择呢?在

顺便说一句:实际上,运行无限客户端和服务器端循环是可以的吗?因为在我看过的每一个教程中,客户在得到答案后马上关闭连接。在

编辑: 下面是一些代码

用于与客户端连接的服务器端循环:

while self.running:
        if self.is_on_turn == p and self.reply is not None:
            cmd = conn.recv(1024)
            if cmd == '':    
                conn.close()
                return
            cmd = eval(cmd)
            if self.is_on_turn != p: # User is not on turn
                print "END"
                conn.sendall("END")
            else:
                self.queue.put(cmd)
        ev.wait()   #    Here works another program with the message and decide what to do next
        ev.clear()  #
        conn.sendall(str(self.message))
        if self.reply:
            ev.wait()   #
            ev.clear()  #
            if self.reply:
                r = conn.recv(1024)
                if r == '':    
                    conn.close()
                    return
                self.queue.put(eval(r))
                ev.wait()   #
                ev.clear()  #
            conn.sendall(str(self.message))
    conn.close()

客户端循环:

^{pr2}$

管道就在那里,因为我一开始是在多处理中创建的,所以应该有PyQt的发射信号,但是正如我所说的,我不确定应该使用哪种方法


Tags: 用户self服务器cmd客户端closeifis