gpt4 book ai didi

python - PyQt 和 TCP/IP

转载 作者:太空宇宙 更新时间:2023-11-03 18:04:23 25 4
gpt4 key购买 nike

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

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

我正在使用Python“socket”的内置模块,我管理客户端的方式是这样的:对于每个用户,我创建一个线程,在其中运行无限循环,直到应用程序结束,检查请求(如果轮到用户)或检查是否有任何内容要发送给其他用户。现在让我们转向客户。每个客户端都有一个无限循环的线程,等待来自服务器的数据。

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

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

编辑:这是一些代码

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

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,这导致了更清晰的代码和更容易的管理:)

关于python - PyQt 和 TCP/IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27134929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com