DataAvailable为false,但应该发送更多数据

时间:2016-03-10 05:06:27

标签: c# .net tcpclient tcplistener networkstream

我有这两种方法:

public QueryResult ListenForConnection()
    {
        if (!ServerStarted)
        {
            IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
            Listener = new TcpListener(ipAddress, 4044);
            Listener.Start();
            ServerStarted = true;                
            while (true)
            {
                Thread.Sleep(10);
                TcpClient tcpClient = Listener.AcceptTcpClient();
                byte[] requestByteBuffer = new byte[1024];
                NetworkStream stream = tcpClient.GetStream();
                stream.Read(requestByteBuffer, 0, requestByteBuffer.Length);
                string httpMessage = Encoding.ASCII.GetString(requestByteBuffer, 0, requestByteBuffer.Length);
                Query query = JsonConvert.DeserializeObject<Query>(httpMessage);
                QueryResult queryResult = QueryService.ExecuteQuery(query);
                string queryResultJson = JsonConvert.SerializeObject(queryResult);
                byte[] responseByteBuffer = new byte[1024];
                responseByteBuffer = Encoding.ASCII.GetBytes(queryResultJson);
                stream.Write(responseByteBuffer, 0, responseByteBuffer.Length);
                stream.Flush();

            }
        }
        else
        {
            return new QueryResult("Failed", null, null);
        }


    }

public QueryResult ProcessRemoteQuery(Query query)
    {
        Byte[] byteBuffer = new Byte[1024];
        string jsonSerializedQuery = JsonConvert.SerializeObject(query);
        byteBuffer = Encoding.ASCII.GetBytes(jsonSerializedQuery);
        NetworkStream stream = Client.GetStream();
        stream.Write(byteBuffer, 0, byteBuffer.Length);
        stream.Flush();
        Byte[] responseByteBuffer = new Byte[1024];
        int responseBytes = stream.Read(responseByteBuffer, 0, responseByteBuffer.Length);
        string jsonDeserializedQueryResult = Encoding.ASCII.GetString(responseByteBuffer, 0, responseBytes);
        QueryResult response = JsonConvert.DeserializeObject<QueryResult>(jsonDeserializedQueryResult);
        return response;
    }

由于某种原因,ProcessAmoteQuery中的DataAvailable为false,这意味着stream.Read()永远不会返回并阻止我的应用程序。奇怪的是,这只是第二次发生,所以我第一次ProcessRemoteQuery工作正常,但第二次从来没有。这里的代码有错误吗?我没有包含实际初始化客户端的代码,但我向您保证已完成。似乎ListenForConnection每次都应该返回数据吗?感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

所以我非常愚蠢,并且最近改变了这一点,以便客户端每次都不会连接。 Listener.AcceptTcpClient在发送第一条消息后正在等待一个新客户端,并且永远不会得到一个,阻止整个消息。