StreamReader.EndOfStream создает IOException - PullRequest
1 голос
/ 18 июня 2010

Я работаю над приложением, которое принимает соединения TCP и считывает данные, пока не будет прочитан маркер </File>, а затем записывает эти данные в файловую систему. Я не хочу отключаться, я хочу, чтобы клиент, отправляющий данные, делал это, чтобы он мог отправлять несколько файлов в одном соединении.

Я использую StreamReader.EndOfStream вокруг моего внешнего цикла, но он выдает IOException, когда клиент отключается. Есть ли лучший способ сделать это?

private static void RecieveAsyncStream(IAsyncResult ar)
{
    TcpListener listener = (TcpListener)ar.AsyncState;
    TcpClient client = listener.EndAcceptTcpClient(ar);

    // init the streams
    NetworkStream netStream = client.GetStream();
    StreamReader streamReader = new StreamReader(netStream);
    StreamWriter streamWriter = new StreamWriter(netStream);

    while (!streamReader.EndOfStream) // throws IOException
    {
         string file= "";
         while (file!= "</File>" && !streamReader.EndOfStream)
         {
              file += streamReader.ReadLine();
         }
         // write file to filesystem
    }
    listener.BeginAcceptTcpClient(RecieveAsyncStream, listener);
}

Ответы [ 2 ]

1 голос
/ 18 июня 2010

Я бы поместил это в блок try-catch.Таким образом, когда выдается исключение, вы можете проверить его, и если это исключение IOException, которое обычно происходит по таймауту;или прервано тайм-аут соединения (т. е. отправитель пропал) и обработайте его, чтобы он наилучшим образом соответствовал вашим потребностям.

0 голосов
/ 18 июня 2010

Вам нужно будет обернуть все предложение while в обработчик исключений, поскольку вы не будете знать, когда / если клиент отключится, и вы вызываете потоковое считывающее устройство в нескольких местах.

...