Python PyQt与TCP/IP
好的,我有一个非常简单的基于回合的应用程序(游戏) 每个用户在服务器上发送一个请求,然后等待响应。重要的是,只有一个用户在服务器上发出请求(发送他的操作),而所有其他用户都在等待,如果服务器向他们发送一些数据,那么他们必须始终检查(在循环中)是否有来自服务器的内容 我正在使用python“socket”的内置模块,我管理客户机的方式是:为每个用户创建一个线程,在其中运行无限循环,直到应用程序结束,该线程检查请求(如果轮到用户)或检查是否有任何内容发送给其他用户。现在让我们转到客户。每个客户端都有一个无限循环的线程,等待来自服务器的数据 问题是GUI是在PyQt4.4中制作的,我无法进入PyQt本身的循环(虽然我已经看到,使用twisted可以做到这一点,但是我必须重写代码),因此我必须使用线程,这意味着我可以使用经典的python线程库或Python PyQt与TCP/IP,python,multithreading,pyqt,Python,Multithreading,Pyqt,好的,我有一个非常简单的基于回合的应用程序(游戏) 每个用户在服务器上发送一个请求,然后等待响应。重要的是,只有一个用户在服务器上发出请求(发送他的操作),而所有其他用户都在等待,如果服务器向他们发送一些数据,那么他们必须始终检查(在循环中)是否有来自服务器的内容 我正在使用python“socket”的内置模块,我管理客户机的方式是:为每个用户创建一个线程,在其中运行无限循环,直到应用程序结束,该线程检查请求(如果轮到用户)或检查是否有任何内容发送给其他用户。现在让我们转到客户。每个客户端都有
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呢?