【发布时间】:2020-12-09 04:15:41
【问题描述】:
我尝试通过 ZeroMQ 将我的 python 进程与 Unity 游戏连接起来。我有一个 python 脚本server.py,它通过对套接字发送消息
import zmq
context = zmq.Context()
socket = context.socket(zmq.PAIR)
socket.bind(f"tcp://*:5556")
socket.send(b"Server message to client")
print("Sent")
我有一个 MonoBehaviour 脚本附加到 Unity 中的游戏对象,如下所示:
public class AiManager : MonoBehaviour
{
void Start()
{
using (var server = new PairSocket())
{
server.Connect("tcp://localhost:5556");
var msg = server.ReceiveFrameString();
Debug.Log(msg);
}
}
}
游戏永远挂在ReceiveFrameString() 上并导致 Unity 崩溃。 server.py 也挂起并且不发送消息。
但是我创建了一个独立的控制台应用程序,代码完全相同:
class Program
{
static void Main(string[] args)
{
using (var server = new PairSocket())
{
server.Connect("tcp://localhost:5556");
var msg = server.ReceiveFrameString();
Console.WriteLine($"From Server: {msg}");
}
}
}
此应用程序完美运行。
我该如何解决这个问题?
【问题讨论】:
-
您的意思是该方法阻塞的时间比您预期的要长,还是您根本没想到它会阻塞?
-
该方法永远阻塞(5 分钟以上,直到我手动终止进程),而控制台应用程序立即工作
-
在接收之前尝试发送消息。建立连接后,服务器通常不会发回消息。您必须至少在收到回复之前发送退货。
-
@jdweng 它有效!在从服务器发送到客户端之前从客户端发送到服务器以某种方式解决了问题。如果您能在答案中解释它为什么有效以及为什么在控制台应用程序中不需要它,我将很高兴接受它
-
一般来说,与控制台应用程序的一个巨大区别是,在控制台中,您不关心线程是否会冻结一段时间,直到有响应......在 Unity 中,基于框架的应用程序也会冻结你的主线程和整个 Unity 编辑器,直到有响应 -> 使用线程或任务