2017-07-25 4 views
-3

J'ai eu un tcp server en JAVA et une classe appelée Client parmi les scripts d'unité. Client est un singleton qui se connecte au serveur à son constructor. Quand j'appuie sur le bouton de lecture, je me connecte au serveur mais quand j'appuie à nouveau pour arrêter le jeu, le client ne se déconnecte pas automatiquement. Quand je relance le jeu, il se pile parce qu'il essaie de se connecter depuis un ordinateur déjà connecté. J'ai essayé de me déconnecter au destructor mais il n'a jamais été appelé. Comment puis-je le faire? J'ai également essayé d'implémenter IDisposable mais je ne sais pas si vous devez l'appeler ou le garbage collector l'appelle (pour moi ce n'est pas le cas). c'est le code du client (readwrite et loop ne sont pas importants pour la question, mais je l'ai laissé au cas où quelqu'un veut):appeler un code lorsque terminé jouer dans l'unité

using Assets.Scripts.Tools; 
using System.Collections; 
using System.Collections.Generic; 
using System.IO; 
using System.Net.Sockets; 
using System.Threading; 
using UnityEngine; 
using System; 

public class Client : System.Object, IDisposable{ 
    private TcpClient tcp; 
    private Stream stream; 
    private IClientCallback callback; 
    private Thread recvThread; 

    private static Client instance = null; 

    public static Client Instance 
    { 
     get 
     { 
      if (instance == null) 
       instance = new Client(); 
      return instance; 
     } 
    } 

    private Client() 
    { 
     Init(); 
    } 

    public void Init() 
    { 
     Log.D("Init the client"); 
     tcp = new TcpClient(); 
     tcp.Connect(Main.IP, Main.PORT); 
     stream = tcp.GetStream(); 
     recvThread = new Thread(loop); 
     recvThread.Start(); 
    } 

    public void setCallback(IClientCallback callback) 
    { 
     this.callback = callback; 
    } 

    // recving loop 
    private void loop() 
    { 
     while (true) 
     { 
      Message msg = Read(); 
      if (callback != null) 
      { 
       callback.Callback(msg); 
      } 
      else 
      { 
       Log.E("callbackPointer is null, msg not handheld"); 
      } 
     } 
    } 

    public void disconnect() 
    { 
     tcp.Close(); 
     stream.Close(); 
    } 

    // read a message from the server (will wait until a message is recved 
    private Message Read() 
    { 
     try 
     { 
      int val; 
      string res = ""; 
      do 
      { 
       val = stream.ReadByte(); 
       res += (char)val; 
      } while (val != Code.END_MESSAGE && val != -1); 
      return new Message(res); 
     } 
     catch (IOException) 
     { 
      Log.E("Could not read from the server, disconnecting"); 
      throw new System.Exception("could not read from the server"); 
     } 
    } 

    // Write a message to the server 
    public void Write(Message msg) 
    { 
     try 
     { 
      Log.D("Write:", msg.getDebug()); 
      stream.Write(msg.getBytes(), 0, msg.getBytes().Length); 
      stream.Flush(); 
     } 
     catch (IOException) 
     { 
      Log.E("Could not send message to the client"); 
      throw new System.Exception("could not write to the server: " + msg.getCode().ToString() + msg.toString()); 
     } 
    } 

    public void Dispose() 
    { 
     Log.D("never been called"); 
    } 

    ~Client() 
    { 
     Log.D("never been called"); 
    } 
} 
+1

pouvez-vous s'il vous plaît poster votre code? –

+0

@MichaelMeyer Je modifie ma question – Roni

+0

peut-être que cela aide? https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnApplicationQuit.html https://docs.unity3d.com/ScriptReference/EditorApplication-playmodeStateChanged.html – yes

Répondre

1

Utilisez la fonction de rappel OnApplicationQuit() et vous déconnecter de votre serveur tcp ou appelez votre disconnect() méthode ici. Ce rappel sera exécuté juste avant la fermeture de l'application, à la fois dans l'éditeur et dans un lecteur autonome intégré.
OnApplicationQuit()