gpt4 book ai didi

python - 通过套接字服务器接收多条消息,但发送了一条

转载 作者:太空宇宙 更新时间:2023-11-04 10:50:24 27 4
gpt4 key购买 nike

A 有一个有两个线程的应用程序。这是一个网络控制的游戏,

1。线程(服务器)

  • 接受套接字连接并接收消息
  • 发送消息后,创建一个事件并将其添加到队列中

代码:

class SingleTCPHandler(SocketServer.StreamRequestHandler):
def handle(self):
try:
while True:
sleep(0.06)
message = self.rfile.readline().strip()
my_event = pygame.event.Event(USEREVENT, {'control':message})
print message
pygame.event.post(my_event)

2。线程(pygame)

  • 负责游戏渲染
  • 通过服务器填充的事件队列接收消息
  • 每 60 毫秒根据消息呈现游戏

这就是游戏的外观。控制消息只是小方 block 的速度。

enter image description here

出于调试的目的,我使用以下虚拟机连接到服务器:

ncat 192.168.56.1 2000

然后发送控制消息。在生产环境中,这些消息将由 Android 设备每 50 毫秒发送一次。

问题

在我的调试环境中,我手动输入几秒钟的消息。在我不输入任何内容的时间里,游戏会多次渲染。发生的情况是 消息(在服务器代码中)不断地使用先前接收到的值呈现。

我发送以下内容:

1:0.5

在启动应用程序的控制台上,由于服务器代码中的 print message 行,我收到以下消息:

alan@alan ~/.../py $ python main.py 
1:0.5

游戏所做的是它不断地(随着它呈现的时间,而不是我输入的每隔几秒)接收这个值。

因为那是 happenig 我希望 while True 中的 print message 也不断输出并且输出是:

alan@alan ~/.../py $ python main.py 
1:0.5
1:0.5
1:0.5
1:0.5
....

然而事实并非如此。请提出建议(如果解释不够充分,我也愿意接受将主题更改为什么的建议)

最佳答案

您的 while True 循环正在轮询套接字,它只会在消息发送时获取消息;它不知道也不关心下游事件消费者对这些消息做了什么,它只是每 0.6 秒发送一个事件并在套接字队列上打印下一条记录的内容。如果您希望游戏在每个渲染循环中打印当前命令,您必须将 print 语句放在渲染循环本身中,而不是套接字轮询器中。此外,由于您似乎希望最后一个命令“坚持”并且不发布新事件,除非用户实际输入某些内容,因此您可能希望在事件调度代码周围放置一个 if message: block 在你这里的套接字处理程序中。现在,如果自您上次检查以来用户未向您提供任何输入,您将每 0.6 秒发送一个空事件。

我也不认为在套接字处理程序中放置一个sleep 或与此相关的循环是不明智的。 SocketServer 将在每次您在套接字上接收到数据时调用它,这样循环就有效地为您完成了,这里所做的一切就是让您面临溢出缓冲区,我想。如果您想控制将事件发布到 pygame 的频率,您可能希望通过在已经有 1 个排队的情况下阻止添加某种类型的事件,或者通过每次从队列中获取给定类型的所有事件来做到这一点游戏循环,然后忽略除第一个或最后一个以外的所有内容。您还可以通过检查处理程序来控制它是否自上次发布事件以来已经过去了一段时间,但是您必须确保事件使用者能够处理具有多个事件等待的事件队列,并且在需要时进行适当的队列刷新。

编辑:

Docs :

The difference is that the readline() call in the second handler will call recv() multiple times until it encounters a newline character, while the single recv() call in the first handler will just return what has been sent from the client in one sendall() call.

所以是的,阅读整行是有保证的。事实上,我也不认为 try 是必需的,因为除非有输入要处理,否则它甚至不会被调用。

关于python - 通过套接字服务器接收多条消息,但发送了一条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14322861/

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