2016-09-17 2 views
1

Lorsque le code de barebones suivant envoie ou reçoit des données, le client est déconnecté.Pourquoi se débarrasser du client de déconnexion NetworkStream

J'ai cru comprendre qu'un bloc utilisant disposait l'objet qu'il crée, c'est-à-dire l'objet NetworkStream, mais pourquoi le socket TcpClient se déconnecte-t-il?

La sortie de la console est ... Vrai Faux

class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.Title = "Client"; 

      Process p = Process.Start(@"C:\Users\Teddy\Documents\visual studio 2015\code\TesyingNetworkStream\Server\bin\Debug\server.exe"); 
      Thread.Sleep(1000); 

      IPEndPoint EP = new IPEndPoint(
        IPAddress.Parse("192.168.1.10"), 4000 
        ); 

      TcpClient cli = new TcpClient(); 
      cli.Connect(EP); 

      UseClient(cli); 

      Console.ReadLine(); 
      p.Kill(); 
      p.Close(); 
     } 

     private static void UseClient(TcpClient cli) 
     { 
      using (NetworkStream ns = cli.GetStream()) 
      { 
       Console.WriteLine(cli.Connected);//True 
      } 
      Console.WriteLine(cli.Connected);//False 
     } 
    } 

Voici le code du serveur si elle compte.

class Program2 
    { 
     static void Main(string[] args) 
     { 
      Console.Title = "Server"; 

      TcpListener lis = new TcpListener(
       new IPEndPoint(
        IPAddress.Any, 4000 
        )); 

      lis.Start(); 

      lis.AcceptTcpClient(); 

      while (true) 
      { 
       Thread.Sleep(10); 
      } 
     } 
    } 

Répondre

3

est ici la mise en œuvre de la fonction GetStream() (de .NET framework source):

public NetworkStream GetStream() { 
    if (m_CleanedUp){ 
     throw new ObjectDisposedException(this.GetType().FullName); 
    } 
    if (!Client.Connected) { 
     throw new InvalidOperationException(SR.GetString(SR.net_notconnected)); 
    } 
    if (m_DataStream == null) { 
     m_DataStream = new NetworkStream(Client, true); 
    } 
    return m_DataStream; 
} 

Notez le true dans l'appel au constructeur NetworkStream. C'est le paramètre ownsSocket. De MSDN:

paramètre

Si la valeur de ownsSocket est true, NetworkStream prend propriété du Socket sous-jacente, et appelant la méthode Close également ferme le socket sous-jacent.

NetworkStream s 's Dispose application Close du courant, qui se ferme alors la prise.

1

Il est parce que cli.GetStream(); ne crée pas un nouveau flux chaque fois que vous l'appelez, il y a un flux unique pour la connexion et chaque appel à cli.GetStream(); retourne le même objet de flux. Lorsque vous disposez de ce flux partagé qui signale au TcpClient que vous avez terminé et marque le TcpClient déconnecté.