gpt4 book ai didi

c# - 用于 Unity3d 5.x 的极简主义 Python 服务器

转载 作者:行者123 更新时间:2023-11-28 20:17:55 25 4
gpt4 key购买 nike

TL;DR:我在 Unity3D 客户端应用程序和服务器上的 UDP python 监听器之间进行通信时遇到问题。

我正在尝试通过 Unity 5.x NetworkTransport LLAPI 和 Python 3.x 套接字模块简单地从 Unity3D 游戏客户端获取低级调用和响应

目标:将发送到服务器的消息弹回客户端。

问题:

  • 当我运行 Unity3d 客户端时,套接字打开并且服务器每秒打印一个新的 recvfrom 数据,但 unity 从未收到退回的数据。
  • 大约 10 秒后,客户端会收到超时错误以及 DisconnectEvent。

状态:

客户端:Unity 5.4

服务器:亚马逊AWS,开放8888端口

服务器端 python 应用程序:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('', 8888))

print ('Listening on port 8888')

while True:
data, addr = s.recvfrom(4096)

if data:
for i in range(0, len(data)):
print (data[i])
print (data, addr)
s.sendto(data, addr)

客户端Unity网络类:

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class NetworkExecutor : MonoBehaviour
{
const string addr = IP_ADDR;
const int port = PORT;

bool connected = false;

// Doing lots of error checks but no need to save them. Let's def this and hold onto it.
byte e;

void Start ()
{
// Some testing involves waiting for responses or repetitious send/receive calls.
// We do this in coroutines for both efficiency and human sanity.
StartCoroutine(TestNetwork());
}

IEnumerator TestNetwork()
{
// Define network configurations.
ConnectionConfig config = new ConnectionConfig();
int reliableChannel = config.AddChannel(QosType.Reliable);
int maxConnections = 10;
HostTopology hostTopo = new HostTopology(config, maxConnections);

// Initialize and connect network with config.
NetworkTransport.Init();
int hostId = NetworkTransport.AddHost(hostTopo);
int connectionId = NetworkTransport.Connect(hostId, addr, port, 0, out e);

Debug.Log("<b>Connect.</b> Host ID: " + hostId + " Connection ID: " + connectionId);
ErrStr(e);

// Send test message.
byte[] msg = System.Text.Encoding.UTF8.GetBytes("Send string");
NetworkTransport.Send(hostId, connectionId, reliableChannel, msg, 4096, out e);
Debug.Log("<b>Send.</b> Msg: " + msg);
ErrStr(e);

// Receive test message.
int recHostId;
int recConnectionId;
int recChannelId;
int recSize;
msg = System.Text.Encoding.UTF8.GetBytes("Unmodified byte buffer.");
NetworkEventType eventType = NetworkTransport.Receive(out recHostId, out recConnectionId, out recChannelId, msg, 4096, out recSize, out e);
Debug.Log("<b>Receive.</b> Type: " + eventType + " Msg: " + System.Text.Encoding.UTF8.GetString(msg));
Debug.Log("(hID:" + recHostId + " cID:" + recConnectionId + " chId:" + recChannelId + " " + recSize + ")");
ErrStr(e);

NetworkTransport.Disconnect(hostId, connectionId, out e);
ErrStr(e);

yield break;
}

string ErrStr(byte e)
{
switch ((NetworkError)e)
{
case NetworkError.Ok:
return "Ok";
case NetworkError.WrongHost:
return "<color=red>Wrong Host</color>";
case NetworkError.WrongConnection:
return "<color=red>Wrong Connection</color>";
case NetworkError.WrongChannel:
return "<color=red>Wrong Channel</color>";
case NetworkError.NoResources:
return "<color=red>No Resources</color>";
case NetworkError.BadMessage:
return "<color=red>Bad Message</color>";
case NetworkError.Timeout:
return "<color=red>Timeout</color>";
case NetworkError.MessageToLong:
return "<color=red>Message Too Long</color>";
case NetworkError.WrongOperation:
return "<color=red>Wrong Operation</color>";
case NetworkError.VersionMismatch:
return "<color=red>Version Mismatch</color>";
case NetworkError.CRCMismatch:
return "<color=red>CRC Mismatch</color>";
case NetworkError.DNSFailure:
return "<color=red>DNS Failure</color>";
default:
return "<color=red><b>Big problem, we don't know this error code.</b></color>";
}
}
}

** 请原谅困惑。与我的自然冲动相反,这里忽略了许多编码约定和良好实践。这是因为该应用程序仅用于了解 Unity 和 Python 最基本的低级网络用法。当可以建立原始信号量时,它将被丢弃并适本地重写。

最佳答案

UDPTCP 都是标准协议(protocol)。这意味着无论您使用什么编程语言,它们都应该能够相互通信。

您的 Python 代码使用的是标准 UDP 代码。您的 Unity 代码不是。您使用的 NetworkTransport API 仅用于两个 Unity 应用程序之间的通信。它是一个 LLAPI 库,它是一个建立在 UDP 之上的锡层。同样,它不是旨在用于 Unity 和标准 UDP 连接之间的连接,而是用于两个 Unity 程序之间的连接。

要与您的 python UDP 代码通信,您必须使用 UdpClient C# 代码中 System.Net.Sockets 命名空间中的类。这是一个 example Unity 中的 UDP 代码。

关于c# - 用于 Unity3d 5.x 的极简主义 Python 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38654628/

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