Создание удаленного сервера с помощью Visual C#
Эта статья поможет вам создать удаленный сервер, к которому другое приложение может получить доступ с помощью Visual C#.
Исходная версия продукта: Visual C #
Исходный номер базы знаний: 307445
Аннотация
В этой статье показано, как создать удаленный сервер, к которому может получить доступ другое приложение. Приложение, обращающееся к этому серверу, может находиться на том же компьютере, на другом компьютере или в другой сети. Удаленный сервер разбивается на две части: объект сервера и серверное приложение. Объект сервера — это объект, с которым взаимодействует клиент, и серверное приложение используется для регистрации объекта сервера в платформе удаленного взаимодействия .NET.
В этой статье рассматриваются следующие пространства имен библиотеки классов Microsoft платформа .NET Framework:
- System.Runtime.Remoting
- System.Runtime.Remoting.Channels
- System.Runtime.Remoting.Channels.Tcp
Требования
В этой статье предполагается, что вы знакомы со следующими разделами:
Создание объекта удаленного сервера
Первым шагом при создании серверного приложения является создание объекта сервера. Объект сервера — это то, что клиентское приложение создает экземпляр и взаимодействует с ним на серверном компьютере. Клиентское приложение делает это через прокси-объект, созданный на клиенте. В этом примере объект сервера находится в библиотеке классов (DLL) и называется myRemoteClass.
- Создайте приложение библиотеки классов в Visual C# .NET. Назовите проект ServerClass. Класс 1 создается по умолчанию.
- В Обозреватель решений переименуйте файл кода Class1.cs в ServerClass.cs.
- Откройте файл ServerClass.cs и переименуйте Class1 в myRemoteClass. Необходимо также переименовать конструктор по умолчанию для класса в , чтобы он соответствовал имени класса. класс myRemoteClass должен наследоваться MarshalByRefObject от класса . Теперь ваш класс должен выглядеть следующим образом:
public class myRemoteClass: MarshalByRefObject < public myRemoteClass() < // TO DO: Add constructor logic here. >>
public bool SetString(String sTemp) < try < Console.WriteLine("This string '' has a length of ", sTemp, sTemp.Length); return sTemp != ""; > catch < return false; >>
Создание удаленного серверного приложения
После создания объекта сервера, с которым будет взаимодействовать клиент, необходимо зарегистрировать этот объект в платформе удаленного взаимодействия. При регистрации объекта необходимо также запустить сервер и заставить сервер прослушивать порт, чтобы клиенты подключились к нему. Для этого требуется тип проекта, который выводит исполняемый файл.
Причина включения объекта сервера в отдельный проект заключается в том, что вы можете легко ссылаться на серверный объект из клиентского проекта. Если вы включите его в этот проект, вы не сможете ссылаться на него, так как ссылки могут быть заданы только для DLL-файлов.
- Создайте консольное приложение в Visual C# .NET, чтобы запустить удаленный сервер. Класс 1 создается по умолчанию.
- В Обозреватель решений переименуйте файл Class1.cs в RemoteServer.cs.
- Добавьте ссылку на System.Runtime.Remoting пространство имен.
- Добавьте ссылку на сборкуServerClass.dll , созданную в предыдущем разделе.
- Используйте инструкцию using для Remoting пространств имен , Remoting.Channels и Remoting.Channels.TCP , чтобы позже в коде не требовалось квалифицировать объявления в этих пространствах имен. Оператор необходимо использовать using перед любыми другими объявлениями.
using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp;
TcpChannel chan = new TcpChannel(8085); ChannelServices.RegisterChannel(chan);
- Полное имя типа регистрируемого объекта (в этом примере — ServerClass.myRemoteClass ), за которым следует имя сборки ServerClass. Укажите здесь имя пространства имен, а также имя класса. Так как пространство имен не указано в предыдущем разделе, используется корневое пространство имен по умолчанию.
- Назовите конечную точку, где объект будет опубликован, как RemoteTest. Чтобы подключиться к объекту, клиенты должны знать это имя.
- SingleCall Используйте режим объекта, чтобы указать окончательный параметр. Режим объекта указывает время существования объекта при его активации на сервере. В случае SingleCall объектов создается новый экземпляр класса для каждого вызова, который выполняет клиент, даже если один и тот же клиент вызывает один и тот же метод несколько раз. С другой стороны, Singleton объекты создаются только один раз, и все клиенты взаимодействуют с тем же объектом.
RemotingConfiguration.RegisterWellKnownServiceType( System.Type.GetType("ServerClass.myRemoteClass, ServerClass"), "RemoteTest", WellKnownObjectMode.SingleCall);
System.Console.WriteLine("Hit to exit. "); System.Console.ReadLine();
Ссылки
Общие сведения о удаленном взаимодействии .NET см. в документации по платформа .NET Framework руководства разработчика.
Сетевая работа в Visual C++ , класс CSocket / Сокеты / Сеть
Создание приложения сервера.
При создании нового проекта выбираем что это будет MFC AppWizard(exe)
и называться он будет server. Выбираем что это Dialog Based приложение, в
следующем окне ставим галочку подтверждения использования Windows Socket.
И далее жмем Next> до упора. Открываем поле редактирования диалога и добиваемся
приблизительно такого произведения искусства.
Далее надо в КлассВизарде создать переменную для EditBoxa
Обратите внимание на то что две переменные можно создать. одну класса CString. так вот она
нам НЕ нужна. надо нам переменная класса CEdit.
Далее редактируем код для каждой из кнопок диалога:
* Дважды щелкаем по кнопке Connect и пишем следующий текст
void CServerDlg::OnOK()
<
// TODO: Add extra validation here
AfxSocketInit(); // Иннициализация системы сокетов
CSocket MySocket; //создаем класс сокета сервера
if (!MySocket.Create(22222)) MessageBox(«Не могу создать сокет сервера»,»»,MB_OK);
// вызываем функцию создания и иннициализации сокета
MySocket.Listen (); // слушаем запросы от клиентов
MySocket.Accept(SendSocket); // принимает запрос на соединение
// переменная SendSocket определена как клас CSocket
// в секции глобальных переменных . эта переменная
// просто объявляется. никаких других операций с ней
// заранее не проводится.
MessageBox(«Готов к передаче»,»»,MB_OK);
// сообщаем о готовности обмена данными
* Дважды щелкаем по кнопке Quit и пишем следующий текст
void CServerDlg::OnCancel()
<
// TODO: Add extra cleanup here
SendSocket.Close(); // Закрываем сокет
CDialog::OnCancel(); // Закрывем программу
>
void CServerDlg::OnButton1()
<
// TODO: Add your control notification handler code here
int BuffLenght = m_edit1.LineLength();
// Вычисляем длину сообщения
SendSocket.Send(&BuffLenght,4);
// Посылаем клиенту длинну сообщения.
char* Buffer = new char[BuffLenght];
// подготавливаем буффер для введенного текста
m_edit1.GetLine(0,Buffer,BuffLenght);
//записываем введенную строку в буфер
SendSocket.Send(Buffer,BuffLenght);
//посылаем строку клиенту. ап. -))
delete Buffer;
//удаляем буфер
>
Создание приложения клиента.
При создании нового проекта выбираем что это будет MFC AppWizard(exe)
и называться он будет klient. Выбираем что это Dialog Based приложение, в
следующем окне ставим галочку подтверждения использования Windows Socket.
И далее жмем Next> до упора. Открываем поле редактирования диалога и добиваемся
приблизительно такого-же произведения искусства как и в случае с сервером.
с подготовительной работой у клиента слегка сложновато. необходимо создать
класс основанный на CSocket. для этого щелкаем другой кнопкой мыши и в
полученном меню выбираем New Class.
Получаем следующую картинку.
Называем создаваемый класс MySocket и задаем что базовым для него
будет класс CSocket.
теперь создаем карту обработки сообщений. Конкретно нас интересует задать
(перегрузить) обработчик функции OnReceive которая автоматом выполняется
когда на сокет приходят данные. Дважды щелкнув по OnReceive в нижнем окошке
перейдем к редактированию кода этой функции.
void MySocket::OnReceive(int nErrorCode)
<
// TODO: Add your specialized code here and/or call the base class
int BufferLenght=10;
// переменная длины буфера должна быть проинициализирована
Receive(&BufferLenght,4);
//принимаем длину следующего пакета
char* Buffer = new char[BufferLenght+1];
//выделяем память под буфер в который щас будем принимать
// пакет (сообщение)
Buffer[BufferLenght]=0;
// записываем 0 в конец строки, чтоб получился ASCIIZ формат.
Receive(Buffer,BufferLenght);
//принимаем строку.
MessageBox(NULL,Buffer,»»,MB_OK); // выводим месаджбокс
delete Buffer;
//освобождаем память
CSocket::OnReceive(nErrorCode);
// так надо по описанию функции
>
Переходим к редактированию кода кнопок диалога
* Дважды щелкаем по кнопке Connect и пишем следующий текст
// переменная MySocket1 определена в секции глобальных переменных
//объявление имеет вид MySocket MySocket1;
void CKlientDlg::OnOK()
<
// TODO: Add extra validation here
if (!MySocket1.Create())
// создание сокета.
if (!MySocket1.Connect(«192.168.0.2»,22222))
//подсоединение к серверу. важно действительно
// указать АйПи адресс сервера и правильный порт.
>
* Дважды щелкаем по кнопке Quit и пишем следующий текст
void CKlientDlg::OnCancel()
<
// TODO: Add extra cleanup here
MySocket1.Close(); // Закрываем сокет
CDialog::OnCancel(); // Закрывем программу
>
* Дважды щелкаем по кнопке GetMessage и пишем следующий текст
void CKlientDlg::OnButton1()
<
// TODO: Add your control notification handler code here
// полностью то же самое что и в функции OnReceive
int BufferLenght=10;
MySocket1.Receive(&BufferLenght,4);
char* Buffer = new char[BufferLenght+1];
Buffer[BufferLenght]=0;
MySocket1.Receive(Buffer,BufferLenght);
MessageBox(Buffer,»»,MB_OK);
delete Buffer;
>
Результат работы программы.
Запускаем приложения сервер и клиент. на сервере нажимаем Connect (1) потом на клиенте
нажимаем Connect (2) после этого в окне сервера набираем текст. (3) и нажимаем
кнопычку
Если потом еще раз нажать Connect либо там либо там вывалится в ошибку.
Вместо заключения.
* Вот собственно и все, здесь приведены только концепции реализации
клиент — серверных приложений Windows — остальная работа за ВАМИ.
Обязательно посмотрите описания для всех используемых здесь функций.
Пример можно скачать и посмотреть здесь, однако предупреждаю
что особых функций обработки ошибок в примерах нет. (на то он и пример)
Вопросы, просьбы и пожелания отправляйте по адрессу kozloff@dviyka.odessa.net
С ув. и пожеланием успехов Денис Козлов.