2016-09-17 3 views
1

Wenn der folgende Bare-Bones-Code Daten sendet oder empfängt, wird die Verbindung zum Client getrennt.Warum entsorgt NetworkStream die Verbindung zum Client

Es war mein Verständnis, dass ein using-Block das Objekt, das es erstellt, dh das NetworkStream-Objekt, aber warum trennt den TcpClient Socket trennen?

Die Konsolenausgabe ist ... Wahr Falsch

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 
     } 
    } 

Hier ist Code-Server, wenn es darauf ankommt.

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

Antwort

3

Hier ist die GetStream() Funktion Implementierung (von .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; 
} 

Notiere die true in dem Aufruf der NetworkStream Konstruktor. Dies ist der ownsSocket Parameter. Von MSDN:

Wenn der Wert des Parameters ownsSockettrue ist, nimmt das Network Besitz des zugrunde liegenden Sockels und rief die Close Methode auch die zugrunde liegende Socket geschlossen.

NetworkStream 's DisposeClose Implementierung ist der Strom, der dann den Sockel verschließt.

1

Es ist, weil cli.GetStream(); keinen neuen Stream Sie es nennen, jedes Mal erstellen, gibt es einen einzigen Strom für die Verbindung und jedem Aufruf cli.GetStream(); kehrt der gleiche Strom-Objekt. Wenn Sie diesen freigegebenen Stream freigeben, der dem TcpClient signalisiert, sind Sie fertig, und der TcpClient wird getrennt.

Verwandte Themen