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

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

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2010, 15:49   #1
TigerX2
 
Регистрация: 03.05.2010
Сообщений: 4
По умолчанию Простой клиент-сервер на C#

Доброго времени суток господа. Возникла маленькая проблемка. Пытаюсь разобраться с сокетами, но пока не очень хорошо получается.
Задачка в упрощенном виде выглядит следующим образом: сервер, при подключении к нему клиента, должен отправить клиенту несколько строк текста. Но почему-то у меня получается отправить и принять только одну

строку. Если пытаюсь загнать больше выпригивает ошибка. В чем может быть ошибка и по какому условию проверять возможность отправления/приема сообщений. Заранее благодарен за любую помощь.
Вот собственно имеющийся код:
Серверная часть:
Код:
static void Main(string[] args)
        {
            StreamWriter streamWriter;
            StreamReader streamReader;
            NetworkStream networkStream;
            TcpListener tcpListener = new TcpListener(5555);

            tcpListener.Start();
            
            Console.WriteLine("Сервер запущен.");
            Console.WriteLine("IP-адрес: 127.0.0.1");
            Console.WriteLine("Порт: 5555");
            Console.WriteLine();

            Socket serverSocket = tcpListener.AcceptSocket();
            
            DirectoryInfo MyDirectory = new DirectoryInfo(@"C:\TestDir");

            try
            {
                if (serverSocket.Connected)
                {
                    //while (true)
                    //{
                        Console.WriteLine("Server: Клиент принят.");

                        networkStream = new NetworkStream(serverSocket);
                        streamWriter = new StreamWriter(networkStream);
                        streamReader = new StreamReader(networkStream);                        
                    
                        // Передать сообщение клиенту
                        streamWriter.WriteLine("Server: Вывод завершен1.");
                        // Эта строка уже не передается !!! В чем ошибка?
                        streamWriter.WriteLine("Server: Вывод завершен2.");         

                        streamWriter.Flush();
                        // Принять сообщение от клиента
                        Console.WriteLine(streamReader.ReadLine());
                    //}
                }
                if (serverSocket.Connected)
                    serverSocket.Close();
                Console.Read();
            }
            catch (SocketException j)
            {
                Console.WriteLine(j);
            }
        }
Клиентская часть:
Код:
public void StartClient()
        {
            TcpClient tcpClient;
            NetworkStream networkStream;
            StreamReader streamReader;
            StreamWriter streamWriter;
            
            try
            {
                tcpClient = new TcpClient("localhost", 5555);
                
                networkStream = tcpClient.GetStream();
                
                streamReader = new StreamReader(networkStream);
                streamWriter = new StreamWriter(networkStream);
                
                // Передали серверу сообщение
                streamWriter.WriteLine("Client: ГОТОВ");
                streamWriter.Flush();
                // Приняли сообщение от сервера
                RecieveDataList.Items.Add(streamReader.ReadLine());                
            }
            catch (SocketException i)
            {
                RecieveDataList.Items.Add("Ошибка: " + i);
            }
        }
TigerX2 вне форума Ответить с цитированием
Старый 03.05.2010, 17:54   #2
(IICuX)
Пользователь
 
Регистрация: 27.04.2010
Сообщений: 22
По умолчанию

используйте переносы строк \r\n после каждой записи в stream
(IICuX) вне форума Ответить с цитированием
Старый 03.05.2010, 18:28   #3
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

\r вроде не обязательно. по крайней мере я просто завершал строку \n и всё работало
Dimarik вне форума Ответить с цитированием
Старый 03.05.2010, 23:11   #4
(IICuX)
Пользователь
 
Регистрация: 27.04.2010
Сообщений: 22
По умолчанию

\r -признак конца строки
\n - переход на след. строку

так вопрос решен?
(IICuX) вне форума Ответить с цитированием
Старый 03.05.2010, 23:51   #5
TigerX2
 
Регистрация: 03.05.2010
Сообщений: 4
По умолчанию

Спасибо, хороший способ собрать строку.
Но теперь возникла другая проблема: строку с переносами сервер формирует нормально, НО клиент сделан на WPF (просто для интереса) и список формируется из items-ов для элемента list. А этот элемент видимо может принимать только строку до разделителя В итоге у меня клиент принимает только то, что находится до первого \r\n.
Как можно попроще разобрать строку на клиенте (видимо в цикле) до знаков переноса и добавить в items-ы?
TigerX2 вне форума Ответить с цитированием
Старый 04.05.2010, 00:14   #6
TigerX2
 
Регистрация: 03.05.2010
Сообщений: 4
По умолчанию

Вопрос решен.
Если кому интересно, сделано следующим образом:
Сервер:
Код:
static void Main(string[] args)
        {
            StreamWriter streamWriter;
            StreamReader streamReader;
            NetworkStream networkStream;
            TcpListener tcpListener = new TcpListener(5555);

            tcpListener.Start();
            
            Console.WriteLine("Сервер запущен.");
            Console.WriteLine("IP-адрес: 127.0.0.1");
            Console.WriteLine("Порт: 5555");
            Console.WriteLine();

            Socket serverSocket = tcpListener.AcceptSocket();
            
            DirectoryInfo MyDirectory = new DirectoryInfo(@"C:\TestDir");

            try
            {
                if (serverSocket.Connected)
                {
                    Console.WriteLine("Server: Клиент принят.");
                    
                    networkStream = new NetworkStream(serverSocket);
                    streamWriter = new StreamWriter(networkStream);
                    streamReader = new StreamReader(networkStream);
                    
                    string ResultString = "";
                    
                    using (StreamWriter sw = new StreamWriter(@"C:\TestDir\TestFile.txt"))
                    {
                        foreach (var i in MyDirectory.GetFileSystemInfos())
                        {
                            ResultString = ResultString + i.FullName + "\r\n";
                            sw.WriteLine(i.FullName);
                        }
                        sw.WriteLine();
                        sw.WriteLine(DateTime.Now);
                        ResultString = ResultString + "\r\n" + DateTime.Now;
                    }
                    //Console.WriteLine(ResultString);
                    
                    streamWriter.WriteLine(ResultString);
                    streamWriter.Flush();
                    Console.WriteLine(streamReader.ReadLine());
                }
                if (serverSocket.Connected)
                    serverSocket.Close();
                Console.Read();
            }
            catch (SocketException j)
            {
                Console.WriteLine(j);
            }
        }
Клиент:
Код:
public void StartClient()
        {
            TcpClient tcpClient;
            NetworkStream networkStream;
            StreamReader streamReader;
            StreamWriter streamWriter;
            
            try
            {
                tcpClient = new TcpClient("localhost", 5555);
                
                networkStream = tcpClient.GetStream();
                
                streamReader = new StreamReader(networkStream);
                streamWriter = new StreamWriter(networkStream);
                
                streamWriter.WriteLine("Client: ГОТОВ");
                streamWriter.Flush();
                
                RecieveDataList.Items.Add(streamReader.ReadToEnd());
            }
            catch (SocketException i)
            {
                RecieveDataList.Items.Add("Ошибка: " + i);
            }
        }
TigerX2 вне форума Ответить с цитированием
Старый 05.05.2010, 13:54   #7
TigerX2
 
Регистрация: 03.05.2010
Сообщений: 4
По умолчанию

Появился еще один вопрос: я серверную часть делаю как службу и получаю "облом".
В методе OnStart я оставляю вот что:
Код:
StreamWriter streamWriter;
            StreamReader streamReader;
            NetworkStream networkStream;
            TcpListener tcpListener = new TcpListener(5555);
 
            tcpListener.Start();
            
           
            Socket serverSocket = tcpListener.AcceptSocket();
            
            DirectoryInfo MyDirectory = new DirectoryInfo(@"C:\TestDir");
 
            try
            {
                if (serverSocket.Connected)
                {
                               
                    networkStream = new NetworkStream(serverSocket);
                    streamWriter = new StreamWriter(networkStream);
                    streamReader = new StreamReader(networkStream);
                    
                    string ResultString = "";
                    
                    using (StreamWriter sw = new StreamWriter(@"C:\TestDir\TestFile.txt"))
                    {
                        foreach (var i in MyDirectory.GetFileSystemInfos())
                        {
                            ResultString = ResultString + i.FullName + "\r\n";
                            sw.WriteLine(i.FullName);
                        }
                        sw.WriteLine();
                        sw.WriteLine(DateTime.Now);
                        ResultString = ResultString + "\r\n" + DateTime.Now;
                    }
                               
                    streamWriter.WriteLine(ResultString);
                    streamWriter.Flush();
                           }
                if (serverSocket.Connected)
                    serverSocket.Close();
                Console.Read();
            }
            catch (SocketException j)
            {
                Console.WriteLine(j);
            }
Служба пытается запуститься ооочень долго и в конце концов говорит, что в нужный лимит уложиться не успела => запускаться не хочет.
Если в методе OnStart меньше кода, то служба запускается без проблем. Что можно сделать? Как увеличить время для запуска службы? Или может быть надо еще как-то код изменить?...
Пробовал в блоке CATCH оставить только один символ ";" - тогда служба запускается и сразу выключается с сообщеием что-то вроде: "т.к служба ничего не делает, то она запустилась и сразу выключилась". Кто что может подсказать?
TigerX2 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сервер+клиент+клиент на телефон Razyiller Работа с сетью в Delphi 3 01.04.2010 20:10
Возможно-ли Клиент-серверное приложение типа Клиент(Pascal) а сервер(CGI)? Demol Работа с сетью в Delphi 1 21.04.2009 16:18
Простой клиент обмена сообщениями eks-s Работа с сетью в Delphi 1 04.03.2008 01:03
простой сервер(клиент) TCP nntpaha Общие вопросы C/C++ 4 25.12.2007 19:02