Вопрос

Я работаю над приложением, которое принимает 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);
}
Это было полезно?

Решение

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top