Streamreader.endofstream производит ioException.
-
28-09-2019 - |
Вопрос
Я работаю над приложением, которое принимает 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, который обычно происходит в тайм-ауте; Или разбитое время ожидания соединения (то есть отправителя исчезло) и обрабатывает его в уловите лучший способ, который подходит для ваших потребностей.
Другие советы
Вам придется обернуть все предложение в обработчике исключений, так как вы не будете знать, когда / если клиент отключается, и вы называете читатель потока в нескольких местах.