Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2010, 21:47   #1
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 823
По умолчанию Pipe,завершение приложения

Собственно решил написать на С# 2 элементарных приложения,которые обмениваются сообщениями через Pipe.Только вот в чем заковыка(скорее всего, она появилась потому,что я недавно начал изучать C#) не могу завершить поток клиента(т.е. идет обмен между приложениями,закрыв одно из них,второе может продолжать отправку сообщений,что вызывает ошибку). Как же сделать так,чтобы при разрыве связи закрывалось и второе приложение с выводом сообщения?
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.IO.Pipes;
using System.Threading;

namespace ConsoleApplication2
{
    class Program
    {

       // string Name2;
      //  string Name;
        string temp1;

        public void ThreadStartServer()
        {
            //Console.WriteLine("Введите Ваше имя");
          //  Name = Console.ReadLine();
            
            // Создаем пайп с именем
            //using (NamedPipeServerStream pipeStream = new NamedPipeServerStream("mytestpipe1")) для 2-го приложения
            using (NamedPipeServerStream pipeStream = new NamedPipeServerStream("mytestpipe"))//для 1-го приложения
            {
                Console.WriteLine("[Server] Создан pipe ");

                // Ожидаем подключения
                pipeStream.WaitForConnection();
                Console.WriteLine("[Server] Соединение установлено");

                using (StreamReader sr = new StreamReader(pipeStream))
                {
                    string temp;
                    
                    // Читаем строку и выводим строку в формате время:сообщение
                    while ((temp = sr.ReadLine()) != null)
                    {
                      /*  if (temp == "выход")
                        {
                            temp1 = temp;
                            Console.WriteLine(temp);
                            break;
                        }*/
                        Console.WriteLine("{0}: {1}", DateTime.Now, temp);
                    }
                }
            }
            
            Console.WriteLine("Соединение потеряно");
        }
        
        public void ThreadStartClient(object obj)
        {
            // Создаем клиент только после того,как сервер создал Пайп
            ManualResetEvent SyncClientServer = (ManualResetEvent)obj;

            //using (NamedPipeClientStream pipeStream = new NamedPipeClientStream("mytestpipe")) для 2-го приложения
            using (NamedPipeClientStream pipeStream = new NamedPipeClientStream("mytestpipe1"))//для 1-го приложения
            {
                // Так ожидание будет бесконечным
                // Можно задать в скобках время ожидания,чтобы его ограничить
                pipeStream.Connect();

                Console.WriteLine("[Client] Pipe соединение было установлено");
                using (StreamWriter sw = new StreamWriter(pipeStream))
                {
                    sw.AutoFlush = true;
                    
                  //  sw.WriteLine(Name);
                    Console.WriteLine("Набирайте сообщение и нажимайте [Enter], или наберите 'выход' для выхода из программы");
                    while ((temp1 = Console.ReadLine()) != null)
                    {
                        if (temp1 == "выход")
                        
                            break;
                       
                        sw.WriteLine(temp1);
                    }
                }
            }
        }
        static void Main(string[] args)
        {
            

            Program Server = new Program();
            Program Client = new Program();

            Thread ServerThread = new Thread(Server.ThreadStartServer);
            Thread ClientThread = new Thread(Client.ThreadStartClient);

            ServerThread.Start();
            ClientThread.Start();
          
            
        }
    }
}
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 30.03.2010, 22:00   #2
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

поставь сервер в прослушку сообщений от клиентов
напр если клиент вышел, посылаем серверу команду определ напр код 0111х155, сервер посылает эту команду др клиенту, клиент, получив такую команду, показывает сообщ об ошибке
примерно так

посмотри книгу TCP/IP Sockets in C# (David B.Makofske, Michael J.Donahoo, KennethL.Calvert), оч хорошая книга, правда нерусиш, но технологии сообщений клиент - сервер, сервер - клиент описаны хорошо
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 30.03.2010, 22:55   #3
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 823
По умолчанию

Не,в общем одно из приложений видит,если второе выходит,и даже пишет об этом
Цитата:
Console.WriteLine("Соединение потеряно");
Но вот как процесс клиента закрыть в этом приложении?.. Возможно это не видно в коде,но каждое из 2-х приложений является и клиентом и сервером(чтобы было спокойно обмениваться сообщениями).Если мы закрываем второе приложение,то сервер первого видит,что клиент второго вышел и наоборот...т.е. надо просто завершить работу первого клиент...но вот как?..пока не сообразил(.
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 31.03.2010, 12:56   #4
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 823
По умолчанию

Попробовал наладить взаимодействие между сервером и клиентом с помощью флагов.Объявил флаги глобально,запустил потоки...но вот в чем дело,клиент не видит флага сервера и наоборот...Посоветуйте простой выход из ситуации
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
использование named Pipe Sparky Общие вопросы .NET 1 29.03.2010 17:54
Определить размер Pipe IceBreaker Помощь студентам 4 04.02.2010 18:28
Создание Pipe на C# (CreateFile) WinApi Помощь студентам 0 23.12.2009 08:07
Завершение приложения lenivec Общие вопросы Delphi 16 05.01.2008 15:23
Завершение приложения, вместе с ОС John_chek Общие вопросы Delphi 5 08.06.2007 16:00