0

Я пытаюсь сделать приложение andorid, которое commuicates с моим сервером через Unity 5.4. Устройства должны быть в одной сети для этого.Возможно ли использование TcpClients в единстве3d для андроида?

Для этого я использую System.Net.Sockets и TcpClient для подключения к моему серверу. Все работает хорошо, когда я запускаю его из редактора или создаю его как автономный Windows. Связь между хостингом ПК и другим компьютером, работающим автономно, возможна и работает по назначению. Как только я построю его как .apk и установлю его на своем смартфоне, я получу SocketException. Также мой телефон застрял в загрузке в течение некоторого времени

Использует TcpClient, возможно ли это на Android с единством3d?

Исключение я получаю:

System.Net.Sockets.SocketException: Connection timed out 

Я убедился, что оба устройства находятся в одной и той же сети, например, 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 ​​получил от игрока префов правильно, то есть.

Есть ли у кого-то идея, что заставляет его даже не устанавливать соединение? Я попробовал Wireshark на своем компьютере, он не показывал никаких входящих пакетов, поэтому я предполагаю, что ошибка иногда возникает при установлении соединения.

Вот изображение для моего выхода журнала из смартфона: LogCat Output

Edit: код сервера

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()); 
      } 
     } 
    } 
+0

Я только что вспомнил об этом. Разве это еще не решено? – Programmer

+0

Теперь это wokring, но я точно не знаю почему. И я хочу предоставить решение для людей, имеющих ту же проблему. У меня было свободное время, когда я был в дороге, поэтому я попробовал это с моим ноутбуком, копировал и вставлял код сервера в новый проект, и он работал. как-то мой сервер просто не принимал андроид, но с использованием 100% того же кода он работал после копирования и вставки его в новый проект. – Kusakari13

+0

Я попробовал, и это сработало из коробки. Вероятно, это проблема межсетевого экрана. Вы можете реализовать его с помощью другого потока или использовать асинхронный метод. Счастливое кодирование! – Programmer

ответ

0

использует TcpClient, что возможно на андроид с Unity3D?

Да, это так. Это очень возможно и должно работать.

Ваша проблема, скорее всего, исходить от этой строки кода:

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

Поскольку ваш хостинг IP сервера является 192.168.178.24. Hardcode значение для тестирования, чтобы узнать, возвращает ли PlayerPrefs.GetString(MenuManager.IpPlayerPrefKey) неправильный IP-адрес.

Может быть что-то вроде:

IPAddress ipAddress = IPAddress.Parse("192.168.178.24"); 

Другое дело, чтобы сделать в коде сервера, чтобы положить Application.runInBackground = true; в вашей Start() функции. Это позволит убедиться, что ваш сервер работает, даже если приложение не находится в фокусе.

И наконец, вы используете серверный разъем synchronous. При подключении, приеме данных с сервера Unity будет блокировать/заморозить, пока эта операция не завершится.Вы должны использовать сокет asynchronous или запустить ваш серверный и клиентский код в другом Thread. Это не похоже на текущую проблему, но вы столкнетесь с ней позже.

+0

спасибо за это! Я пробовал жестко закодированный ip раньше, он действительно работал на автономном компьютере и редакторе, но не на мобильном телефоне. вот что меня больше смущает, что все работает для автономного ПК и редактора, но не мобильного. мой сервер не работает в единстве, в настоящее время это просто консольное приложение, и позже это будет служба Windows. спасибо человеку, я дам асинхронную связь, когда мне удастся запустить текущую версию. – Kusakari13

+0

Если вы пробовали жестко закодированную часть, и это не сработало, я предлагаю вам попробовать это в другой сети. Подключите оба устройства к другому маршрутизатору и проверьте его. В то же время вы также должны отправить код сервера в свой вопрос. – Programmer

+0

Я добавил код сервера для приложения-сокола. также я попробовал его в 2 отдельных сетях – Kusakari13