DataAvailable ложно, но должно быть отправлено больше данных

У меня есть эти два метода:

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

По какой-то причине DataAvailable в ProcessRemoteQuery имеет значение false, то есть stream.Read() никогда не возвращает и не блокирует мое приложение. Странно то, что это происходит только во второй раз, поэтому первый ProcessRemoteQuery работает нормально, а второй - нет. Здесь есть ошибка с кодом? Я не включил код, который на самом деле инициализирует клиента, но уверяю вас, это сделано. Кажется, что ListenForConnection обязательно должен возвращать данные каждый раз? Любая помощь приветствуется, спасибо.

1 ответ

Так что я был очень, очень глуп, и недавно изменил это, чтобы клиент не подключался каждый раз. Listener.AcceptTcpClient ожидал нового клиента после отправки первого сообщения и не получал его, блокируя все это.

Другие вопросы по тегам