为什么要部署NetworkStream会断开客户端连接

时间:2016-09-17 14:58:49

标签: c# using networkstream disconnect

当以下裸骨码发送或接收数据时,客户端将断开连接。

我理解使用块处理它创建的对象,即NetworkStream对象,但为什么TcpClient Socket断开连接?

控制台输出是...... 真正 假

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

如果重要,这是服务器代码。

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

2 个答案:

答案 0 :(得分:4)

这里是GetStream()函数实现(来自.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;
}

请注意true构造函数调用中的NetworkStream。这是ownsSocket参数。来自MSDN

  

如果ownsSocket参数的值为true,则NetworkStream占用   底层Socket的所有权,并调用Close方法   关闭底层的Socket。

NetworkStream' Dispose实施Close<流,然后关闭套接字。

答案 1 :(得分:2)

这是因为cli.GetStream();每次调用时都不创建新流,连接有一个流,每次调用cli.GetStream();都会返回相同的流对象。当您处理向TcpClient发出信号的共享流时,您已完成并且它标记TcpClient已断开连接。