Мне тяжело понять, что это - ошибка сервера или какая-то ошибка в моем приложении.Если я смотрю в Wireshark, он выглядит так, как будто он отправляет данные на сервер;но как я могу быть уверен, что он получен?
Что касается ошибки сервера ... это, вероятно, не так, поскольку это приложение Java, работающее в браузере (я просто делаю для него свой собственный клиент), и яможет выполнять команды просто отлично через браузер все время.Это также работает в моем приложении, но после 2-3 команд на сервер (все еще подключенный), он перестает работать - как будто что-то блокирует фактическую отправку.
Надеюсь на какое-то руководство.Может быть, цикл как-то связан с этим?Если я перезапускаю приложение, команды снова работают нормально, так что через некоторое время он перестает работать.На самом деле эта ошибка была уже более 5 лет;но просто скомпилировал приложение еще раз, и это все еще проблема: -)
Спасибо за чтение.
Я, вероятно, должен упомянуть, что внутри функции HandleIncomingMessages () у меня есть этот поток, выполняющий отправку keep-сообщенияживой для сервера (символ "g").
// Create send-alive thread.
Thread aliveThread = new Thread((ThreadStart)delegate
{
do
{
Connection.Send("g");
Thread.Sleep(100000);
}
while (true);
});
aliveThread.Name = "Send-alive Thread";
aliveThread.Start();
aliveThread.IsBackground = true;
Вот некоторые фрагменты того, как это работает.
client = new TcpClient(server, port);
//client.NoDelay = true; // both has same result
using (stream = client.GetStream())
using (reader = new StreamReader(stream, Encoding.ASCII))
{
do
{
try
{
// Read the stream into the buffer.
while ((readBuffer = reader.ReadLine()) != null)
{
ConnectionHelper.HandleIncomingMessage(readBuffer);
}
}
catch (Exception E)
{
WriteLine("CreateConnection() Exception: " + E.Message);
WriteLine("CreateConnection() Exception: StackTrace: " + E.StackTrace);
// Exit on error.
Environment.Exit(1);
}
} // do
while (stream.DataAvailable);
// Clean up.
reader.Close();
stream.Close();
client.Close();
WriteLine("Disconnected.");
}
HandleIncomingMessage () просто анализирует данные и отправляет команды в Send() функция ниже.
internal static void Send(string message)
{
if (stream.CanWrite)
{
byte[] byteData =
Encoding.ASCII.GetBytes(message + Environment.NewLine);
Encoding enc = Encoding.ASCII;
WriteLine("Send(): " + enc.GetString(byteData));
// Send <message>
stream.Write(byteData, 0, byteData.Length);
stream.Flush();
return;
}
WriteLine("Send(): Exception: Cannot write to stream!");
}