TCP Отправка файла и закрытие NetworkStream C#
У меня возникла проблема. Я сделал TCP класс, отвечающий за общение между сервером и клиентом. Суть в том, что клиент отсылает серверу строку, тот ее обрабатывает и отсылает файл с результатом. Вот Функции клиента и сервера
Client
public void TcpClientConnect(string ip, int port, string itemFound)
{
try
{
using TcpClient client = new(ip, port);
using NetworkStream stream = client.GetStream();
SendMessage(stream, itemFound);
Log?.Invoke($"{DateTime.Now:T} Идет поиск \"{itemFound}\"");
string response = RecvMessage(stream);
Log?.Invoke($"{DateTime.Now:T} {response}");
using (BinaryReader read = new(stream, Encoding.UTF8, true))
{
long length = read.ReadInt64();
string name = read.ReadString();
LoadFile(stream, length, name);
Log?.Invoke($"{DateTime.Now:T} Файл загружен. Имя файла \"{name}\"");
}
}
catch (Exception ex)
{
Log?.Invoke($"{DateTime.Now:T} {ex.Message}");
}
}
client LoadFile
private void LoadFile(NetworkStream stream, long length, string name)
{
using FileStream fs = File.Create($"{SavePath}\\{name}");
long received = 0;
byte[] bytes = new byte[1024];
while (received < length)
{
int toReceive = (int)Math.Min(bytes.Length, length - received);
int bytesReceived = stream.Read(bytes, 0, toReceive);
if (bytesReceived == 0)
{
Log?.Invoke("Неожиданное завершение потока при получении файла");
return;
}
received += bytesReceived;
fs.Write(bytes, 0, bytesReceived);
}
}
Server
public void TcpServerConnect(TcpClient _client)
{
try
{
using TcpClient client = _client;
using (NetworkStream stream = client.GetStream())
{
string itemSearch = RecvMessage(stream);
Log?.Invoke($"{DateTime.Now:T} Поиск по слову \"{itemSearch}\"");
string[] result = search.FoundString(itemSearch).Split(':'); //обработка строки + файл в архив
if (result[0] == "0")
{
SendMessage(stream, "Результаты не обнаружены");
Log?.Invoke($"{DateTime.Now:T} Результаты не обнаружены");
return;
}
SendMessage(stream, $"Найдено: {result[0]}. Идет отправка файла");
Log?.Invoke($"Найдено: {result[0]}. Идет отправка файла");
LoadFile(stream, result[1]);
Log?.Invoke($"Файл отправлен. Клиент отключился");
File.Delete(result[1].Substring(0, result[0].Length - 4));
}
}
catch (Exception ex)
{
Log?.Invoke($"{DateTime.Now:T} {ex.Message}");
}
}
Server LoadFile
private void LoadFile(NetworkStream stream, string path)
{
FileInfo file = new(path);
if (!file.Exists)
{
Log?.Invoke($"Ошибка: Файл отправки не найден");
return;
}
using (BinaryWriter bw = new(stream, Encoding.UTF8, true))
{
bw.Write(file.Length);
bw.Write(file.Name);
bw.Flush();
}
using FileStream fs = file.OpenRead();
fs.CopyTo(stream);
}
Интересный факт, что файлы менее 100Мб отправляются, а вот уже выше иногда, чаще бывают косяки.
По типу такого
Unable to write data to the transport connection: An existing connection was forcibly closed by the remote host. Почему клиент закрывает соединение?
Обработка файла может идти до 20 минут+