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 (read
write
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");
}
}
pouvez-vous s'il vous plaît poster votre code? –
@MichaelMeyer Je modifie ma question – Roni
peut-être que cela aide? https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnApplicationQuit.html https://docs.unity3d.com/ScriptReference/EditorApplication-playmodeStateChanged.html – yes