18 / 34 / 2
Регистрация: 28.01.2012
Сообщений: 181
1

Архитектура "сервер-клиент", "точка-многоточие"

11.04.2012, 21:37. Показов 1826. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
использование ServerSocket1 и ClientSocket1 при структуре "точка-точка" не вызывает затруднений. Проблема возникла когда задумался использовать структуру "точка-многоточие". Компоненты ServerSocket1 и ClientSocket1 смогут реализовать структуру "точка-многоточие"? если невозможно, то какие компоненты мне надо использовать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.04.2012, 21:37
Ответы с готовыми решениями:

Архитектура клиент-сервер
Сделал программку которая добавляет адреса с помощью запросов (вводишь номер аккаунта, и с бд...

Многоуровневая архитектура. клиент-сервер-БД
мне нужно разработать проект: Клиент связывается с сервером через интернет. Сервер и БД...

Клиент-сервер на основе SocketTCP архитектура написания
Добрый день Гуру, есть у меня задача: Необходимо написать клиент - серверную программу. Сервер на...

Трехзвенная архитектура: БД SQL + сервер + клиент (WPF)
В общем нужно реализовать трёхзвуенную архитектуру . Чтобы клент отправлял запрос на сервер,сервер...

Трёхзвенная архитектура, используя Java - сервер и C# - клиент
Доброго всем времени суток! Нужно переписать приложение, используя трехзвенную архитектуру. Есть...

3
Эксперт С++
3953 / 1808 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
11.04.2012, 22:18 2
Dondok, ничего не понял...

Архитектура "точка-точка" подразумевает обмен клиента с клиентом.
Вы же приводите пример, в котором уже используете компонент класса TServerSocket (который не является "одиночным", то есть, изначально подразумевает подключение к себе множества клиентов, вы это называете "многоточием") и компонент TClientSocket, который и выступит точкой...

Из этого следует (вашими словами), что архитектура описанная вами уже является "точка-многоточие".
Поэтому, ответ: да, этими компонентами можно организовать такую структуру.

P.S. Честное слово, этот вопрос напомнил тесты в ГАИ, где ответ содержится в вопросе.
0
18 / 34 / 2
Регистрация: 28.01.2012
Сообщений: 181
11.04.2012, 23:29  [ТС] 3
MikeSoft, да меня в заблуждение ввело то что на клиенте можно ввести IP-адрес клиента, а на сервере невозможно ввести IP-адреса клиентов. Мне нужно сделать сервер, который опрашивает всех клиентов и мог бы составить список подключенных ему клиентов и по запросу можно было бы обратиться к конкретному клиенту за информацией
0
Эксперт С++
3953 / 1808 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
12.04.2012, 00:28 4
Dondok, вам до этого неплохо было бы почитать о самой архитектуре.
Клиент устанавливает соединение с сервером, а не наоборот.
Поэтому, схема работу будет примерно следующей:
Клиент1 установил соединение с Сервером. Заносим информацию о Клиенте1 в БД.
Клиент2 установил соединение с Сервером. Заносим информацию о Клиенте2 в БД.
...
КлиентN установил соединение с Сервером. Заносим информацию о КлиентеN в БД.
...
Произошло отключение Клиента2. Удаляем всю информацию о Клиенте2 из БД.
...
Все подключения сервер хранит TIdTCPServer (да и его давно устаревшая версия TServerSocket, кажется, тоже) в отдельном динамическом списке (или обычной структуре указателей, если вы захотите такое реализовать... хозяин - барин, как говорится).

Собственно говоря, в момент подключения и отключения возбуждаются события OnConnect и OnDisconnect... через стандартные обработчики можно достучаться и к контексту подключения (сокеты):
C++
1
2
3
4
5
6
7
8
9
10
11
12
//---------------------------------------------------------------------------
void __fastcall TMainControl::TCPServerConnect(TIdContext *AContext)
{
    String PeerInfo = AContext->Binding->PeerIP + ":" + IntToStr(AContext->Binding->PeerPort);
    ClientListUpdate(ClientList, ClientsGrid, ucAdd, PeerInfo, AContext, false);
}
//---------------------------------------------------------------------------
void __fastcall TMainControl::TCPServerDisconnect(TIdContext *AContext)
{
    String PeerInfo = AContext->Binding->PeerIP + ":" + IntToStr(AContext->Binding->PeerPort);
    ClientListUpdate(ClientList, ClientsGrid, ucDel, PeerInfo, AContext, false);
}

Не по теме:

ClientListUpdate - это самописная функция... привёл просто для примера...


Собственно говоря, дальше можете реализовать подобие Heart-Beat протокола проверки активности клиента... Когда я учился в университете, мне пришлось писать некое систему управления удалённым ПК (рассказывал здесь: Управление удаленным компьютером)... Так вот в этом проекте я опционально оставлял возможность удаления "мёртвых" клиентов (тех, которые в заданный промежуток времени не подавали никаких признаков жизни ...
Проект получился достаточно объёмным, поэтому приоткрою его часть, связанную с проверкой активности (писать с нуля минимальный образец сейчас нет желания, поэтому просто посмотрите код, найдите для себя что-нибудь полезное):

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
//---------------------------------------------------------------------------
void __fastcall TMainControl::AliveCheckThread(TObject *Sender)
{
  AliveCheckTimer->Enabled = false;
  int DeadLine = 5;
 
  AliveProgressBar->Max = ClientList->Count;
  if ((ClientList->Count > 0) && (ClientList->Strings[0] != " Нет подключений ")) {
    AliveProgressBar->Position = 0;
    StatusLabel->Caption = "Проверка связи с клиентами...";
    Sleep(500);
    Application->ProcessMessages();
    for (int i = 0; i < ClientList->Count; i++, AliveProgressBar->Position++) {
      SPeer *CheckPeer = (SPeer *)ClientList->Objects[i];
        if (CheckPeer) {
          if (CheckPeer->CurrentContext) {
            unsigned short hh1,mm1,ss1,ms1,hh2,mm2,ss2,ms2;
            DecodeTime(CheckPeer->LastAccess,hh1,mm1,ss1,ms1);
            DecodeTime(Now().CurrentDateTime(),hh2,mm2,ss2,ms2);
            int Value = ss2-ss1;
            (Value < 0) ? (Value += 60) : (false);
            if (Value >= DeadLine) {
              bool Alive = CheckPeer->CurrentContext->Connection->Connected();
              if (!Alive) {
                try {
                  ClientListUpdate(ClientList,ClientsGrid,ucDel,CheckPeer->IPPort,CheckPeer->CurrentContext,false);
                  StatusLabel->Caption = "Cоединение с " + CheckPeer->IPPort + " утеряно.";
                  Application->ProcessMessages();
                  Sleep(1000);
                  break;
              } catch (...) {
                try {
                  ClientListUpdate(ClientList,ClientsGrid,ucDel,CheckPeer->IPPort,CheckPeer->CurrentContext,true);
                } catch (...) {
                }
              }
            }
          }
        }
      }
    }
  }
  StatusLabel->Caption = "Ожидание подключений ...";
  AliveCheckTimer->Enabled = true;
}
//---------------------------------------------------------------------------
Структура SPeer выглядела примерно так:
SPeer Declaration
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
struct SPeer {
  unsigned int ID;
  String HID;
  String IPPort;
  bool Blocked;
  TDateTime BlockedUntil;
  TDateTime LastLogon;
  TDateTime LastAccess;
  String DynamicPass;
  String StaticPass;
  ActionCommand Task;
  TIdContext *CurrentContext;
  SPeer *RequestedPeer;
  bool Ready;
  struct sSendPart {
    TRect PartRect;
    TPoint ScreenSize;
    __int64 SizeOfJPEG;
  } SendPart;
  struct sSendEvents {
    bool KeyboardTask;
    KEYBDINPUT KI;
    MOUSEINPUT MI;
    int NewQuality;
  } SendEvents;
  TMemoryStream *SendBuf;
  TByteDynArray Buffer;
  TClientThread *ClientThread;
};


Думаю, полезных идей немножко подкинул
Изучите архитектура и в бой
0
12.04.2012, 00:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.04.2012, 00:28
Помогаю со студенческими работами здесь

Трехзвенная архитектура: Бд (Access) + сервер (win form) + клиент (wpf)
В общем нужно реализовать трехзвенку (БД (Access) + Сервер (Win Form) + Клиент (WPF)). Сервер...

Защита программы и архитектура "клиент-сервер"
Здравствуйте. Я пишу на Delphi программу для предприятия, на котором работаю. Но у фирмы несколько...

Клиент-серверная архитектура: клиент, как веб-интерфейс
Доброго времени суток уважаемые форумчане. Не могли бы вы проконсультировать меня по следующему...

Взаимодействие WinCC с Labview 2013, как сервер-клиент, так и клиент-сервер
Здравствуйте. Интересует информация о взаимодействии WinCC с Labview 2013, как сервер-клиент, так и...

Клиент-сервер в один клик!(элемет сервер, клиент)
Вот решил поделиться с вами своей идеей и её реализацией. Всегда написание Сервера и Клиента к...

TCP клиент-сервер в UDP клиент - сервер
Помогите, пожалуйста, переписать код приложения по TCP клиент-сервер в UDP клиент - сервер... ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

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