在unity3d中使用TcpClients是否可行?



我正试图通过Unity 5.4与我的服务器通信的android应用程序。设备需要在同一网络中才能这样做。

为此,我使用System.Net.Sockets和TcpClient连接到我的服务器。当我在编辑器中运行它或将其作为Windows独立构建时,一切都运行良好。托管服务的pc和运行独立的不同pc之间的通信是可能的,并且按预期工作。只要我把它构建为。apk并安装在我的智能手机上,我就会得到一个SocketException。而且我的手机加载卡住了很长一段时间

是否使用TcpClient,是否可以在android上使用unity3d ?

我得到的异常是:

System.Net.Sockets.SocketException: Connection timed out

我确保两台设备都在同一个网络中,例如,我的Pc主机服务器的Ip地址是192.168.178.24,我的智能手机的Ip地址是192.168.178.113。

所需的端口是开放的,防火墙允许数据通过。

我在Unity中运行这个代码:

private TcpClient client;
private StreamWriter writer;
void Start()
{
    try
    {
        client = new TcpClient(AddressFamily.InterNetwork);
        IPAddress ipAddress = IPAddress.Parse(PlayerPrefs.GetString(MenuManager.IpPlayerPrefKey));
        Debug.Log(ipAddress.ToString());
        client.Connect(ipAddress, 11000);
        writer = new StreamWriter(client.GetStream());
        Debug.Log("connected");
    }
    catch (ArgumentNullException ane)
    {
        Debug.Log(string.Format("ArgumentNullException : {0}", ane.ToString()));
    }
    catch (SocketException se)
    {
        Debug.Log(string.Format("SocketException : {0}", se.ToString()));
    }
    catch (Exception e)
    {
        Debug.Log(string.Format("Unexpected exception : {0}", e.ToString()));
    }
}

我仔细检查了从玩家偏好接收的Ip地址是否正确,它是正确的。

有人知道是什么原因导致它甚至没有建立连接吗?我在我的pc上尝试了Wireshark,它没有显示任何传入的包,所以我的猜测是错误有时是在建立连接期间。

这是我的智能手机日志输出的图像:LogCat输出

编辑:服务器代码

public class ServiceListener
{
    public TcpListener Listener;
    public void StartListening()
    {
        IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
        IPAddress ipAddress = Array.Find<IPAddress>(ipHostInfo.AddressList, ipMatch => ipMatch.AddressFamily == AddressFamily.InterNetwork);
        Listener = new TcpListener(ipAddress, 11000);
        Listener.Start();
    }
    public void StopListening()
    {
        Listener.Stop();
    }
}
static void Main()
    {
        ServiceListener currentListener = new ServiceListener();
        currentListener.StartListening();
        TcpClient currentClient = currentListener.Listener.AcceptTcpClient();
        StreamReader reader = new StreamReader(currentClient.GetStream());
        Console.WriteLine("Connected");
        while (true)
        {
            byte[] messageBytes = new byte[1024];

            if (!reader.EndOfStream)
            {
                string message = reader.ReadLine();
                string[] messageParts = message.Split('|');
                int xOffset = int.Parse(messageParts[0]);
                int yOffset = int.Parse(messageParts[1]);
                bool leftClick = bool.Parse(messageParts[2]);
                bool rightClick = bool.Parse(messageParts[3]);

                Console.WriteLine(string.Format("x:{0},y:{1},left:{2},right:{3}", xOffset, yOffset, leftClick, rightClick));
            }
            else
            {
                currentClient = currentListener.Listener.AcceptTcpClient();
                reader = new StreamReader(currentClient.GetStream());
            }
        }
    }

是否使用TcpClient,是否可以在android上使用unity3d ?

是的,它是。这是很有可能的,应该是可行的。

你的问题很可能来自这行代码:

IPAddress ipAddress = IPAddress.Parse(PlayerPrefs.GetString(MenuManager.IpPlayerPrefKey));

因为你的主机服务器IP是192.168.178.24。硬编码用于测试PlayerPrefs.GetString(MenuManager.IpPlayerPrefKey)是否返回无效IP地址的值。

可能是这样的:

IPAddress ipAddress = IPAddress.Parse("192.168.178.24");
在服务器代码中要做的另一件事是将Application.runInBackground = true;放在Start()函数中。这将确保即使应用程序不在焦点上,服务器也在运行。

最后,您当前正在使用synchronous服务器套接字。当连接,从服务器接收数据时,Unity将阻塞/冻结,直到该操作完成。您应该使用asynchronous套接字或在另一个Thread中运行服务器和客户端代码。这看起来不像当前的问题,但您稍后会遇到它。

相关内容

  • 没有找到相关文章

最新更新