即使服务器端没有数据,NetworkStream.DataAvailable也为true

时间:2015-06-23 09:26:06

标签: c# .net networkstream

我有2个简单的应用程序 - 服务器和客户端。目前,服务器只是等待客户端连接,打印networkstream.DataAvailable状态,冻结5秒并再次打印networkstream.DataAvailable状态。 客户端做同样的事情,除了它不等待连接但连接到服务器。 服务器端代码:

 static void Main(string[] args)
    {           
        int port = 8880;
        IPAddress localAddress = IPAddress.Parse("127.0.0.1");

        TcpListener serverListener = new TcpListener(localAddress, port);
        serverListener.Start();
        TcpClient incomingConnection = serverListener.AcceptTcpClient();
        IPEndPoint RemAddr = (IPEndPoint)incomingConnection.Client.RemoteEndPoint; ;
        Console.WriteLine("Connection: {0}:{1}", RemAddr.Address, RemAddr.Port);

        NetworkStream networkStream = incomingConnection.GetStream();

        StreamWriter sw = new StreamWriter(networkStream, Encoding.UTF8) { AutoFlush = true };            
        Console.WriteLine("networkstream.DataAvailable is {0}", networkStream.DataAvailable);
        Thread.Sleep(5000);
        Console.WriteLine("networkstream.DataAvailable is {0}", networkStream.DataAvailable);
        ...

客户端代码:

static void Main(string[] args)
    {
        IPAddress remoteaddr = IPAddress.Parse("127.0.0.1");

        int port = 8880;
        TcpClient tcpclient = new TcpClient();
        tcpclient.Connect(remoteaddr, port);
        NetworkStream networkstream = tcpclient.GetStream();
        StreamWriter sw = new StreamWriter(networkstream, Encoding.UTF8);
        StreamReader sr = new StreamReader(networkstream, Encoding.UTF8);

        Console.WriteLine("networkstream.DataAvailable is {0}", networkstream.DataAvailable);
        Thread.Sleep(5000);
        Console.WriteLine("networkstream.DataAvailable is {0}", networkstream.DataAvailable);
        ...

所以,我有一个问题。在服务器端,我有以下输出:

Connection: 127.0.0.1:55919
networkstream.DataAvailable is False
networkstream.DataAvailable is False

在服务器端输出:

networkstream.DataAvailable is False
networkstream.DataAvailable is True

因此客户端显示我的networkStream中有数据。但是没有任何数据!这是一个问题,因为在我的应用程序中,我使用networkstream.DataAvailable来检测是否有任何数据从服务器发送。 所以,问题是 - 我做错了什么?如何正确检查数据的可用性?

1 个答案:

答案 0 :(得分:1)

Thomas Levesque在评论部分回答了我的问题:

从服务器的角度来看,没有什么可读的,因为客户端没有写任何东西。我认为StreamWriter在创建BOM时会写入BOM,因此需要3个字节。并且sr.Read()尝试读取一个字符,但除了BOM之外没有什么可读的,因此它会阻塞。 - Thomas Levesque 10分钟前