0

J'essaie de faire une application andorid qui communique avec mon serveur via Unity 5.4. Les périphériques doivent être dans le même réseau pour le faire. Pour cela, j'utilise System.Net.Sockets et un TcpClient pour me connecter à mon serveur. Tout fonctionne bien quand je le lance hors de l'éditeur, ou le construis comme un Windows autonome. La communication entre un PC hébergeant le service et un PC différent exécutant le standalone est possible et fonctionne comme prévu. Dès que je le construis comme un .apk et l'installe sur mon smartphone j'obtiendrai une exception de SocketException. Aussi mon téléphone est bloqué de chargement pendant un certain tempsL'utilisation de TcpClients dans unity3d pour android est-elle possible?

L'utilisation d'un TcpClient, est-ce possible sur android avec unity3d?

L'exception que je reçois est:

System.Net.Sockets.SocketException: Connection timed out 

Je me suis assuré que les deux appareils sont dans le même réseau, par exemple l'IP pour mon PC hébergeant le serveur est 192.168.178.24 et l'ip pour mon smartphone est 192.168.178.113.

Les ports requis sont ouverts et le pare-feu laisse passer les données.

Je suis Runnig ce code dans l'unité:

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

i revérifié si l'adresse IP des joueurs recieved prefs est correct, il est.

Est-ce que quelqu'un a une idée de ce qui l'empêche d'établir une connexion? J'ai essayé Wireshark sur mon PC, il n'affichait aucun paquet entrant, donc je suppose que l'erreur est parfois lors de l'établissement de la connexion.

est ici une image pour ma sortie du journal du smartphone: LogCat Output

Edit: Code Serveur

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

Je viens juste de m'en souvenir. Est-ce résolu? – Programmer

+0

Ça se passe maintenant, mais je ne sais pas exactement pourquoi. Et je veux fournir une solution pour les personnes ayant le même problème. J'ai eu du temps libre quand j'étais sur la route, donc je l'ai essayé avec mon ordinateur portable, j'ai copié et collé mon code de serveur dans un nouveau projet et ça a marché. en quelque sorte mon serveur n'a tout simplement pas accepté Android, mais en utilisant 100% le même code, il a travaillé après copier et coller dans un nouveau projet – Kusakari13

+0

Je l'ai essayé et cela a fonctionné hors de la boîte. C'était probablement un problème de pare-feu. Vous pouvez l'implémenter avec un autre thread ou utiliser une méthode asynchrone. Codage heureux! – Programmer

Répondre

0

utilise un TcpClient, est-ce possible sur android avec Unity3D?

Oui, c'est. C'est très possible et ça devrait marcher.

Votre problème est susceptible de provenir de cette ligne de code:

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

Depuis votre adresse IP du serveur d'hébergement est 192.168.178.24. Hardcode la valeur à des fins de test pour voir si PlayerPrefs.GetString(MenuManager.IpPlayerPrefKey) renvoie une adresse IP non valide.

Peut-être quelque chose comme:

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

Une autre chose à faire dans votre code serveur est de mettre Application.runInBackground = true; dans votre fonction Start(). Cela garantira que votre serveur est en cours d'exécution même lorsque l'application n'est pas active.

Enfin, vous utilisez actuellement le socket serveur synchronous. Lors de la connexion, la réception des données du serveur, Unity bloque/gèle jusqu'à ce que cette opération se termine.Vous devez utiliser le socket asynchronous ou exécuter le code du serveur et du client dans un autre Thread. Cela ne ressemble pas au problème actuel, mais vous le rencontrerez plus tard.

+0

merci pour cela! J'ai déjà essayé une adresse IP codée en dur, elle fonctionnait sur un PC et un éditeur autonomes mais pas sur un mobile. C'est la chose qui me dérange le plus, que tout fonctionne pour PC autonome et éditeur, mais pas mobile. mon serveur ne fonctionne pas dans l'unité, il est actuellement juste une application console et ce sera un service windows plus tard. Merci, je vais essayer la communication asynchrone quand j'arriverai à faire fonctionner la version actuelle. – Kusakari13

+0

Si vous avez essayé la partie codée en dur et que cela n'a pas fonctionné, je vous suggère d'essayer ceci dans un autre réseau. Connectez les deux périphériques à un autre routeur et testez-le. En même temps, vous devez également publier le code du serveur dans votre question. – Programmer

+0

J'ai ajouté le code du serveur pour l'application de cosole. aussi je l'ai essayé dans 2 réseaux séparés – Kusakari13