Pipe is broken с#
Я сделал сервер копирования,который по запросу клиента копирует файл в папке проекта по имени.Когда я делал все в одном файле,то программа работала.Когда я решил разделить файлы и сделать в клиенте процесс,который запускает сервер,то у меня вылетела ошибка Pipe is broken в строке writer.Flush(); клиента.С чем это связано?
Программа для клиента:
using System.Diagnostics;
using System.IO;
using System.IO.Pipes;
using System.Net;
using System.Text;
class Task4 {
static void Main(string[] args)
{
Process process=Process.Start("C:\\Users\\Максим\\source\\repos\\Os_Lab4\\Task4(1)\\bin\\Debug\\net6.0\\Task4(1).exe");
Thread.Sleep(100);
//Client
var client = new NamedPipeClientStream("PipesOfPiece");
client.Connect();
Console.WriteLine("Client connected");
StreamReader reader = new StreamReader(client);
StreamWriter writer = new StreamWriter(client);
while (true)
{
Console.WriteLine("Enter name of file and name of destination file");
string input = Console.ReadLine();
if (String.IsNullOrEmpty(input)) break;
writer.WriteLine(input);
writer.Flush();
Console.WriteLine(reader.ReadLine());
}
}
}
Программа для сервера:
using System.IO.Pipes;
class Server
{
static void StartServer()
{
Task.Factory.StartNew(() =>
{
var server = new NamedPipeServerStream("PipesOfPiece");
server.WaitForConnection();
Console.WriteLine("Client connected to server");
StreamReader reader = new StreamReader(server);
StreamWriter writer = new StreamWriter(server);
while (true)
{
var line = reader.ReadLine();
Console.WriteLine("Server's response: ");
writer.WriteLine(line);
writer.Flush();
Console.WriteLine(reader.ReadLine());
if (line != null) CopyFileonServer(line.Split()[0], line.Split()[1]);
}
});
}
static void CopyFileonServer(string name, string name1)
{
string path = "C:\\Users\\Максим\\source\\repos\\Os_Lab4\\Task4\\";
string path1 = path + name1;
path += name;
File.Copy(path, path1);
/*
Thread newThread = new Thread(CopyServer(name ,name1));
newThread.Name = String.Format("Thread{0}", 1);
newThread.Start();
*/
}
static void Main(string[] args)
{
Console.WriteLine("Сервер запущен");
StartServer();
}
}
Ответы (1 шт):
Автор решения: aepot
→ Ссылка
Уберите Task.Factory.StartNew, оставьте код просто в методе StartServer. У вас Main завершается сразу же и сервер выключается.
На будущее, вместо Task.Factory.StartNew используйте Task.Run. Еще почитайте что-нибудь про IDisposable, Path.Combine и буквальные строковые литералы @"text".