Я использую sftp для передачи файлов. Когда тестовый клиент передает файлы на сервер, сеть сервера отключается, и поток файлов SftpFileStream всегда застревает при закрытии файла. Вот мой код:
bool sendComplate = false;
do
{
try
{
SftpClient sftpClient = new SftpClient("192.168.9.111", 8889, "clh", "chen");
sftpClient.Connect();
sftpClient.KeepAliveInterval = new TimeSpan(100);
SftpFileStream sftStream = sftpClient.Open("tst.iso", FileMode.OpenOrCreate);
sftStream.Timeout = new TimeSpan(1000);
long serverFileLength = sftStream.Length;
sftStream.Seek(serverFileLength, SeekOrigin.Current);
FileStream fsFile = File.Open(@"F:\公司文件\我的文件\操作系统\YLMF_GHOST_WIN7_SP1_X86_2018_0628.iso", FileMode.Open);
fsFile.Seek(serverFileLength, SeekOrigin.Current);
byte[] buffer = new byte[1024 * 1024 * 10];
do
{
int rendLength = fsFile.Read(buffer, 0, buffer.Length);
if (rendLength > 0)
{
AutoResetEvent reset = new AutoResetEvent(false);
Action writeToFile = () =>
{
int sendCnt = 0;
do
{
try
{
sftStream.Write(buffer, 0, rendLength);
sftStream.Flush();
}
catch (Exception exp)
{
sendCnt++;
}
} while (sendCnt < 3 && sendCnt > 0);
reset.Set();
};
writeToFile.BeginInvoke(new AsyncCallback((rt) =>
{
writeToFile.EndInvoke(rt);
}), null);
if (!reset.WaitOne(1000 * 120))
{
fsFile.Close();
sftStream.Close();
//sftpClient.Disconnect();
//sftpClient.Dispose();
sendComplate = false;
break;
}
}
serverFileLength += rendLength;
if (serverFileLength >= fsFile.Length)
{
sftStream.Close();
sftStream.Close();
//sftpClient.Disconnect();
//sftpClient.Dispose();
sendComplate = true;
}
} while (serverFileLength < fsFile.Length);
}
catch (Exception exp)
{
}
} while (!sendComplate);
Приведенный выше код, который я использовал, является системным файлом 3G для тестирования. Когда файл достигает половины, сеть сервера закрывается. В это время клиент обнаруживает, что сеть работает ненормально, и отключает поток файлов.