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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2011, 10:41   #1
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
Вопрос Клиент-серверное приложение

Реализую с помощью стандартных классов(TcpListener и TcpClient) языка C# клиент-серверное приложение. Для этого создал два собственных класса:
Сервер:
Код:
public class Server
    {
        #region Поля, необходимые в классе "Сервер"
        public TcpListener tcpListener = null;
        #endregion

        #region Конструктор с параметрами №1(IPAddress, Port)
        public Server(IPAddress IPAddress, Int32 Port)
        {
            this.tcpListener = new TcpListener(IPAddress, Port);
        }
        #endregion

#region Метод, необходимый для выполнения "прослушки" сервером
        public String Make_Listen()
        {
            String returnedValue="";
            this.tcpListener.Start();

            Socket serverSocket = this.tcpListener.AcceptSocket();            
            NetworkStream networkStream = null;
            StreamReader streamReader = null;

            try
            {
                networkStream = new NetworkStream(serverSocket);

                streamReader = new StreamReader(networkStream);
                returnedValue = streamReader.ReadLine();                
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);                
            }
            serverSocket.Close();
            this.tcpListener.Stop();            
            return returnedValue;
        }
    #endregion
    }
Клиент:
Код:
    public class Client
    {
        #region Поля, необходимые в классе "Клиент"
            public TcpClient tcpClient = null;
        #endregion

        #region Конструктор с параметрами №1
            public Client(String aHostName, Int32 aPort)
            {
                this.tcpClient = new TcpClient(aHostName, aPort);
            }
        #endregion

        #region Метод для пересылки информации на сервер
            public void SendData(String aData)
            {
                NetworkStream networkStream = null;
                StreamWriter streamWriter = null;                

                try
                {
                    
                    networkStream = this.tcpClient.GetStream();                    

                    streamWriter = new StreamWriter(networkStream);

                    streamWriter.WriteLine(aData);

                    streamWriter.Flush();

                }
                catch (SocketException ex)
                {
                    MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                   
                    return;
                }
                streamWriter.Close();
                
            }
        #endregion
Засовываем переменную класса Server в бесконечный цикл, из которого вызываем метод Make_Listen().Когда делаем первую пересылку информации с клиента на сервер, то все работает как надо(строка нормально отсылается и принимается), но когда пытаемся повторить данную операцию, то "выскакивает" исключение:
Цитата:
InvalidOperationException: Операция не разрешается на неподключенных сокетах
Работа серверного приложения осуществляется с помощью создания нового процесса благодаря компоненту BackGroundWorker.
Подскажите, что может быть не так(по предположению, имеются некоторые проблемы в работе с сервером) и как избавиться от проблемы?
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.

Последний раз редактировалось Mixim; 24.03.2011 в 10:44.
Mixim вне форума Ответить с цитированием
Старый 25.03.2011, 01:26   #2
xil
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 98
По умолчанию

Этот код возьми в while(true){} (или как больше нравиться зацикливать)

Код:
Socket serverSocket = this.tcpListener.AcceptSocket();            
            NetworkStream networkStream = null;
            StreamReader streamReader = null;

            try
            {
                networkStream = new NetworkStream(serverSocket);

                streamReader = new StreamReader(networkStream);
                returnedValue = streamReader.ReadLine();                
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);                
            }

и проверяй есть ли входные подключения
Код:
if (tcpListener.Pending())
P.S. сам только учусь с сокетами общаться =)
Как вы сформулируете вопрос так вам и ответят
xil вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Клиент Серверное приложение BARNEY Общие вопросы Delphi 2 28.10.2010 09:30
Клиент-серверное приложение Куралай_ Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 14.05.2010 10:00
Возможно-ли Клиент-серверное приложение типа Клиент(Pascal) а сервер(CGI)? Demol Работа с сетью в Delphi 1 21.04.2009 16:18
Клиент-серверное приложение: Callback MaTBeu Общие вопросы C/C++ 13 02.06.2008 20:27
Клиент-серверное приложение veryseldom Работа с сетью в Delphi 8 20.08.2007 19:57