Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQt与TCP/IP_Python_Multithreading_Pyqt - Fatal编程技术网

Python PyQt与TCP/IP

Python PyQt与TCP/IP,python,multithreading,pyqt,Python,Multithreading,Pyqt,好的,我有一个非常简单的基于回合的应用程序(游戏) 每个用户在服务器上发送一个请求,然后等待响应。重要的是,只有一个用户在服务器上发出请求(发送他的操作),而所有其他用户都在等待,如果服务器向他们发送一些数据,那么他们必须始终检查(在循环中)是否有来自服务器的内容 我正在使用python“socket”的内置模块,我管理客户机的方式是:为每个用户创建一个线程,在其中运行无限循环,直到应用程序结束,该线程检查请求(如果轮到用户)或检查是否有任何内容发送给其他用户。现在让我们转到客户。每个客户端都有

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

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

我正在使用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()
客户端循环:

def main_loop(self, pipe, conn, e, o):   #e is event, o is bool (whether the client has to answer back to the server)
    is_on_turn = conn.recv(4096)
    pipe.send((is_on_turn))
    while True:
        if is_on_turn == h or o.value and o.value is not None:
            conn.send(str(pipe.recv()))
        pipe.send(eval(conn.recv(4096)))
        e.wait()
        e.clear()

管道就在那里,因为我一开始是在多处理中制作的,应该有PyQt的发射信号,但是正如我所说的,我不确定使用哪种方法,所以结果是,我刚刚使用了ekhumoro建议的QTcpServer和QTcpSocket,这使得代码更加简洁,管理更加容易:)

您确实需要解决您的问题。总结一下,发布一些代码示例,告诉我们到目前为止您尝试了什么…如果您使用的是PyQt,为什么不使用and呢?