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 ожидал нового клиента после отправки первого сообщения и не получал его, блокируя все это.