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());
}
}
}
Je viens juste de m'en souvenir. Est-ce résolu? – Programmer
Ç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
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