Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/32: Рейтинг темы: голосов - 32, средняя оценка - 4.59
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
1

Небольшое консольное клиент-серверное приложение по Named Pipe

18.10.2012, 12:32. Показов 6610. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужно пообщаться между клиентом и сервером через именованные каналы, но у меня кое что не получается.
Словесно: создаю поток сервера и поток клиента. Клиент подключается к серверу. Сервер пишет в поток сообщение клиенту и он считывает это первое сообщение правильно. Дальше когда я отправляю сообщение от клиента серверу то оно теряется (сервер получает пустую строку), а когда от сервера пытаюсь отправить сообщение то клиент получает текст System.IO.StreamReader.
Что я делаю не так? Думал может буефера чистить надо или синхронизировать как-то, но таких методов у них не нашёл.

Пример из MSDN, но я его несколько переделал под себя и упростил (msdn'овский вообще не работал так как там была попытка сначала открыть потоки для чтения-записи, а потом соединялись с сервером. Видимо ошибка какая-то).

Сервер:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
using System.IO;
using System.IO.Pipes;
using System.Threading;
 
class PipeServer
{
    static int numThreads = 4;
 
    static void Main()
    {
        for (int i = 0; i < numThreads; i++)
        {
            Thread newThread = new Thread(new ThreadStart(ServerThread));
            newThread.Start();
        }
        Console.WriteLine("Press enter to exit.");
        Console.ReadLine();
    }
 
    private static void ServerThread()
    {
        NamedPipeServerStream pipeServer =
            new NamedPipeServerStream("testpipe", PipeDirection.InOut, numThreads);
 
        {
            Console.WriteLine("NamedPipeServerStream thread created.");
 
            // Wait for a client to connect
            pipeServer.WaitForConnection();
 
            Console.WriteLine("Client connected.");
            try
            {
                // Read the request from the client. Once the client has
                // written to the pipe its security token will be available.
                StreamReader sr = new StreamReader(pipeServer);
                StreamWriter sw = new StreamWriter(pipeServer);
                {
                    sw.AutoFlush = true;
 
                    //верификация сервера
                    sw.WriteLine("I am the true server!");
 
                    //получаю сообщение от клиента
                    string messageFromClient = sr.ReadLine();
 
                    //вывожу сообщение на экран (ничего не выводится. Сообщение всегда пустое!)
                    sw.WriteLine(messageFromClient);
 
                    //работа сервера на этом заканчивается
                    pipeServer.Disconnect();
                }
            }
            // Catch the IOException that is raised if the pipe is broken
            // or disconnected.
            catch (IOException e)
            {
                Console.WriteLine("ERROR: {0}", e.Message);
                Console.ReadKey();
            }
        }
    } // ServerThread()
} // PipeServer
Клиент:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using System.IO;
using System.IO.Pipes;
using System.Security.Principal;
 
class PipeClient
{
    static int numThreads = 4;
 
    static void Main()
    {
        NamedPipeClientStream pipeClient =
            new NamedPipeClientStream("localhost", "testpipe",
            PipeDirection.InOut, PipeOptions.None,
            TokenImpersonationLevel.Impersonation);
        pipeClient.Connect();
        StreamWriter sw = new StreamWriter(pipeClient);
        StreamReader sr = new StreamReader(pipeClient);
 
        {
            sw.AutoFlush = true;
 
            //верификация сервера. Клиент её проходит, а значит он удачно считывает что было записно в sr!
            if (sr.ReadLine() == "I am the true server!")
            {
                //отправляю сообщение серверу
                sw.WriteLine("Message for server");
 
                //получаю ответ, но теперь через sr считать данные не получается и в
                //messageFromServer всегда получается содержимое = System.IO.StreamReader). Это не исключение, а именно содержимое которое считывается
                string messageFromServer = sr.ReadLine();
 
                //вывожу ответ сервера
                Console.Write(sr);//печатает System.IO.StreamReader
 
                Console.ReadKey();
            }
            else
            {
                Console.WriteLine("Server could not be verified.");
                Console.ReadKey();
            }
        }
    } // Main()
}
Ну и скрин работы программы после создания сервера и подключения клиента в первый раз (остальные подключения ничем от первого отличаться не будут) прикрепляю.
Миниатюры
Небольшое консольное клиент-серверное приложение по Named Pipe  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.10.2012, 12:32
Ответы с готовыми решениями:

Консольное клиент серверное приложение
Здравствуйте. Возник вопрос, как создать консольное клиент серверное приложение,которое должно...

Клиент-серверное приложение: как определить, что сервер/клиент не отвечает в течении определенного времени
Пишу клиент-серверное приложение. Использую TCPListener и TCPClient. Вопрос: как определить что...

Клиент-серверное приложение
Народ, у меня не хочет работать приложение. Скажите, что я делаю не так? Будет здорово, если мой...

Клиент-серверное приложение
Как создать Клиент-серверное приложение чтоби бил 1 сервер и возможность подключения к нему...

1
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
18.10.2012, 22:52  [ТС] 2
Заметил что без sw.AutoFlush() у меня и запись в поток происходит неудачно. Делаю вывод что для sr тоже что-то нужно сделать чтобы работало как это предпологается,но что?

Добавлено через 8 часов 15 минут
Ну вот. Неужели никто такое не пишет, вроде как клиент-серверные приложения это то что так распространено в реальной жизни за границами университетов и наверняка все должны хорошо знать эту тему, а тут такая тишина

Добавлено через 1 час 58 минут
Почему-то что я не делал, но WriteLine и ReadLine с NamedPipe потоком ну нифига не работают. По байтикам всё пишеться и читаеться, с WriteLine и ReadLine ну никак. Они для этого хоть предназначены вообще?
0
18.10.2012, 22:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.10.2012, 22:52
Помогаю со студенческими работами здесь

Клиент-серверное приложение
Клиент-серверное приложение между процессов с помощью именованых каналов Здравствуйте. Тут...

Клиент-серверное приложение
Здарвствуйте уважаемые форумчане, есть такое приложение (создано исключительно для теста...

Клиент-Серверное приложение на C#
Доброго времени суток. Возможно я буду не первым кто задает подобны вопрос, но все же: подскажите...

Клиент-серверное приложение
Заинтересовался написанием клиент-серверных приложений, с чего начать? что написать? есть ли...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru