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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2013, 12:32   #1
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию Клиент-серверное приложение

Доброго времени суток, господа форумчане!
Тема подымалась не одну сотню(может тысячу) раз. Но, перелопатив тонны тем, статей, хабра, я так и не смог до конца разобраться с несколькими вопросами. Написал(нашел в сети, разобрал более-менее) клиент и сервер, точнее посмотрел разные статьи и что-то подобное собрал.
Чего я хочу сделать: win-forms приложение. На одном ПК будет приложение-сервер, на десяти других приложение-клиент. Приложения-клиенты, к примеру, печатают текст в richtextbox и по нажатию на кнопку этот текст отправляется серверу. Сервер, смотрит на этот текст и выполняет определенные действия, к примеру выводит у себя сообщение: "клиент №1 прислал такое сообщение, в нем столько-то символом".
Как я понял, это должен быть асинхронный сервер.
То, что я нашел в сети работает так:
1.создаются переменные - ИП-адрес и порт.
2.Создаем сокет с этим адресом и портом.
3.Начинаем прослушивать.
4."Socket handler = sListener.Accept();" - мало понятно что, это вроде как создает еще один сокет и когда клиент подключается, клиент работает через этот сокет.(если можно, подробно объясните, кто знает.)
5.Дальше просто полученные данные переводим, и отправляем ответ.

Код:
  IPHostEntry ipHost = Dns.GetHostEntry("localhost");
            IPAddress ipAddr = ipHost.AddressList[0];
            IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000);

            // Создаем сокет Tcp/Ip
            Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

            // Назначаем сокет локальной конечной точке и слушаем входящие сокеты
            try
            {
                sListener.Bind(ipEndPoint);
                sListener.Listen(10);

                // Начинаем слушать соединения
                while (true)
                {
                    Console.WriteLine("Ожидаем соединение через порт {0}", ipEndPoint);

                    // Программа приостанавливается, ожидая входящее соединение
                    Socket handler = sListener.Accept();
                    string data = null;

                    // Мы дождались клиента, пытающегося с нами соединиться

                    byte[] bytes = new byte[1024];
                    int bytesRec = handler.Receive(bytes);

                    data += Encoding.UTF8.GetString(bytes, 0, bytesRec);

                    // Показываем данные на консоли
                    Console.Write("Полученный текст: " + data + "\n\n");

                    // Отправляем ответ клиенту\
                    string reply = "Спасибо за запрос в " + data.Length.ToString()
                            + " символов";
                    byte[] msg = Encoding.UTF8.GetBytes(reply);
                    handler.Send(msg);

                    if (data.IndexOf("<TheEnd>") > -1)
                    {
                        Console.WriteLine("Сервер завершил соединение с клиентом.");
                        break;
                    }

                    handler.Shutdown(SocketShutdown.Both);
                    handler.Close();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                Console.ReadLine();
            }

Вроде как один из способов сделать асинхронный сервер это через колбеки, но я не знаю как с ними разобраться, может есть еще варианты или подскажите по колбекам. Читал про класс TCPListener.
Так вот, кто подскажет как реализовать такое или тыкните чего почитать, чтобы не задавать глупых вопросов. Я прочту и может что-то выйдет
Кто что знает - подскажите.
Спасибо заранее.
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 04.07.2013, 12:32   #2
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

вот код клиента:
Код:
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace SocketClient
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                SendMessageFromSocket(11000);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                Console.ReadLine();
            }
        }

        static void SendMessageFromSocket(int port)
        {
            // Буфер для входящих данных
            byte[] bytes = new byte[1024];

            // Соединяемся с удаленным устройством

            // Устанавливаем удаленную точку для сокета
            IPHostEntry ipHost = Dns.GetHostEntry("localhost");
            IPAddress ipAddr = ipHost.AddressList[0];
            IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, port);

            Socket sender = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

            // Соединяем сокет с удаленной точкой
            sender.Connect(ipEndPoint);

            Console.Write("Введите сообщение: ");
            string message = Console.ReadLine();

            Console.WriteLine("Сокет соединяется с {0} ", sender.RemoteEndPoint.ToString());
            byte[] msg = Encoding.UTF8.GetBytes(message);

            // Отправляем данные через сокет
            int bytesSent = sender.Send(msg);

            // Получаем ответ от сервера
            int bytesRec = sender.Receive(bytes);

            Console.WriteLine("\nОтвет от сервера: {0}\n\n", Encoding.UTF8.GetString(bytes, 0, bytesRec));

            // Используем рекурсию для неоднократного вызова SendMessageFromSocket()
            if (message.IndexOf("<TheEnd>") == -1)
                SendMessageFromSocket(port);

            // Освобождаем сокет
            sender.Shutdown(SocketShutdown.Both);
            sender.Close();
        }
    }
}
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 04.07.2013, 12:52   #3
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

А не хотите попробовать поработать с WCF? Весьма мощная и удобная технология
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 04.07.2013, 17:37   #4
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

Хм.. даже и не думал об этом.. да и никогда не работал с WCF.
Может лучше через сокеты?
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 04.07.2013, 17:40   #5
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

А чем лучше?
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 04.07.2013, 19:18   #6
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

Эм.. затрудняюсь ответить. Имел ввиду, что лучше тем, что я хоть чуточку в сокетах разбираюсь. А с WCF никогда не работал.
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 05.07.2013, 10:50   #7
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Попробуйте, это весьма достойная и перспективная технология
Причем уровень вхождения в WCF ниже, чем в сокеты, т.к. оно всю черновую часть комуникаций делает само
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 05.07.2013, 11:04   #8
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

Вот, что нашел по этому поводу..
http://www.progblog.ru/Posts/WCF-Chat

Но тут мне сразу стало все непонятно. У меня как-бы с базовыми знаниями есть некий проблемы. Я вот не понял, что такое интерфейс, что и почему в статье выше пишется в таких скобках [].
Спеши медленно.
asmars вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Клиент-Серверное приложение и БД Mihail.Glukhov БД в Delphi 17 25.04.2012 11:52
Клиент-Серверное приложение...? spamer Общие вопросы по программированию, компьютерный форум 2 15.03.2012 12:42
клиент-серверное приложение roxy1807 БД в Delphi 0 19.04.2011 19:02
Клиент-серверное приложение Mixim C# (си шарп) 1 25.03.2011 01:26
Возможно-ли Клиент-серверное приложение типа Клиент(Pascal) а сервер(CGI)? Demol Работа с сетью в Delphi 1 21.04.2009 16:18