Сервер не получает запись () здесь и там - PullRequest
0 голосов
/ 11 марта 2012

Мне тяжело понять, что это - ошибка сервера или какая-то ошибка в моем приложении.Если я смотрю в 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!");
}
...