1

我正在开发一个接受 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);
}
4

2 回答 2

1

我会把它放在 try-catch 块中。这样,当抛出异常时,您可以检查它是否是通常在超时时发生的 IOException;或断开的连接超时(即发件人不见了)并以适合您需求的最佳方式处理它。

于 2010-06-18T00:14:04.067 回答
0

您必须将整个 while 子句包装在异常处理程序中,因为您不知道客户端何时/是否断开连接并且您在多个位置调用流读取器。

于 2010-06-18T12:16:46.390 回答