Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

TServerSocket, работа с несколькими клиентами

4.9K
19 января 2009 года
Valar
81 / / 18.03.2008
Вопрос по специфики использования класса TServerSocket.

 
Код:
ServerSocket1->Socket->Connections[0]->SendText("Text String");


Код выше отправляет клиенту, индекс соединения которого равен 0 текстовую строку. Как грамотно построить обслуживание более одного клиента? Т.е. как при получении сообщения от клиента (обработка события OnClientRead), получить индекс соединения.
41K
29 января 2009 года
kalyan_418
1 / / 15.07.2008
Цитата: Valar
Вопрос по специфики использования класса TServerSocket.

вот я веду учет подключенных пользователей:
 
Код:
ServerSocket1->Socket->Connections[0]->SendText("Text String");


Код выше отправляет клиенту, индекс соединения которого равен 0 текстовую строку. Как грамотно построить обслуживание более одного клиента? Т.е. как при получении сообщения от клиента (обработка события OnClientRead), получить индекс соединения.



Код:
ArchLog(" -- Подключение пользователя", false, false);
    //AnsiString d = IntToStr(KolUsers - 1);
    while (Temp2 < ListView1->Items->Count)
        {
        if (ListView1->Items->Item[Temp2]->Caption == "*")
            {
            Temp1 = false;
            break;
            }
        Temp2++;
        }
    //ShowMessage("RemoteAddress: " + Socket->RemoteAddress + " RemoteHost: " + Socket->RemoteHost);
    if (Temp1)
        {
        ListView1->Items->Add();
        ListView1->Items->Item[ListView1->Items->Count - 1]->Caption = IntToStr(KolUsers - 1);
        ListView1->Items->Item[ListView1->Items->Count - 1]->SubItems->Add(IntToStr(KolUsers - 1));
        ListView1->Items->Item[ListView1->Items->Count - 1]->SubItems->Add(IntToStr(Socket->SocketHandle));
        ListView1->Items->Item[ListView1->Items->Count - 1]->SubItems->Add("0");
        ListView1->Items->Item[ListView1->Items->Count - 1]->SubItems->Add("0");
        ListView1->Items->Item[ListView1->Items->Count - 1]->SubItems->Add("0");
        ListView1->Items->Item[ListView1->Items->Count - 1]->SubItems->Add(Socket->RemoteAddress);
        }
    else
        {
        ListView1->Items->Item[Temp2]->Caption = IntToStr(KolUsers - 1);
        ListView1->Items->Item[Temp2]->SubItems->Strings[0] = IntToStr(KolUsers - 1);        //Add(d);
        ListView1->Items->Item[Temp2]->SubItems->Strings[1] = IntToStr(Socket->SocketHandle);
        ListView1->Items->Item[Temp2]->SubItems->Strings[2] = "0";
        ListView1->Items->Item[Temp2]->SubItems->Strings[3] = "0";
        ListView1->Items->Item[Temp2]->SubItems->Strings[4] = "0";
        ListView1->Items->Item[Temp2]->SubItems->Strings[5] = Socket->RemoteAddress;
        }
    Socket->SendText("#YNUM;" + IntToStr(KolUsers - 1));
    ArchLog(" -- >> \"#YNUM;" + IntToStr(KolUsers - 1) + "\", пользователю " + ListView1->Items->Item[ListView1->Items->Count - 1]->Caption, false, true);
    StatusBar1->Panels->Items[0]->Text = "Пользователей: " + IntToStr(KolUsers);


а это их обслуживание:
Код:
void __fastcall TForm1::Server1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
String s = Socket->ReceiveText();
if (s.SubString(1, 1) == "#")
    {
    AnsiString GlobalNick = IntToStr(UserNumPor(Socket->SocketHandle));
    AnsiString s1 = "";
    ArchLog( " -- << \"" + s + "\"", true, false);
    try
        {
        if (s.SubString(1, s.Pos(";")) == "#ENDS;")
            {
            s.Pos(";");
            s.Delete(1, s.Pos(";"));
            if (s.SubString(1, s.Pos(";")) == "#MPAS;")
                {
                s.Delete(1, s.Pos(";"));
                bool Temp1 = true;
                for (int i = 0; i < GlobalDataUser; i++)
                    {
                    AnsiString Temp2 = ReadUserData(i);
                    Temp2 = ind.login;
                    Temp2 += ";";
                    Temp2 += ind.pass;
                    if (s.SubString(1, s.Length()) == Temp2)
                        {
                        ListView1->Items->Item[GlobalNick.ToInt()]->SubItems->Strings[4] = IntToStr(i);
                        if (ind.Locked == false)
                            {
                            for (int j = 0; j < ListView1->Items->Count; i++)
                                {
                                s.Pos(";");
                                if (Temp2.SubString(1, Temp2.Pos(";") - 1) == ListView1->Items->Item[j]->Caption)
                                    {
                                    TForm3 *Form3 = new TForm3(this);
                                    ListView1->ItemIndex = UserNumPor(Socket->SocketHandle);
                                    Form3->Memo1->Lines->Add("C таким логином (" + s.SubString(1, s.Pos(";") - 1) + "), пользователь уже подключен к серверу");
                                    Form3->BitBtn1Click(Sender);
                                    delete Form3;
                                    Socket->Close();
                                    Temp1 = false;
                                    break;
                                    }
                                else
                                    {
                                    EpsilonIni->WriteInteger("Temp", "User", i);
                                    Memo1->Lines->Add(DateToStr(Date()) + ", " + TimeToStr(Time()) + " -- Подключен " + s.SubString(1, s.Pos(";") - 1));
                                    ArchLog(" -- Подключен " + s.SubString(1, s.Pos(";") - 1), false, false);
                                    Socket->SendText("#YVER;");

                                    ArchLog(" -- >> \"#YVER;\", пользователю " + ListView1->Items->Item[GlobalNick.ToInt()]->Caption, false, true);
                                    ListView1->Items->Item[GlobalNick.ToInt()]->Caption = s.SubString(1, s.Pos(";") - 1);

                                    ListView1->ItemIndex = ListView1->Items->Count - 1;
                                    Temp1 = false;
                                    break;
                                    }
                                }
                            }
                        else
                            {
                            Memo1->Lines->Add(DateToStr(Date()) + ", " + TimeToStr(Time()) + " -- Попытка зайти с заблокированного пользователя(" + s.SubString(1, s.Pos(";") - 1) + ")");
                            ArchLog(" -- Попытка зайти с заблокированного пользователя (" + s.SubString(1, s.Pos(";") - 1) + ")", false, false);
                            WindAdd(Sender, "Попытка зайти с заблокированного пользователя(" + s.SubString(1, s.Pos(";") - 1) + ")", bfWarning);
                            TForm3 *Form3 = new TForm3(this);
                            ListView1->ItemIndex = UserNumPor(Socket->SocketHandle);
                            Form3->Memo1->Lines->Add("Данный пользователь (" + s.SubString(1, s.Pos(";") - 1) + ") заблокирован");
                            Form3->BitBtn1Click(Sender);
                            delete Form3;
                            Socket->Close();
                            Temp1 = false;
                            }
                        }
                    }
                if ((Temp1 == true) && (s.SubString(1, s.Length()) == "Admin;Admin"))
                    {
                    Socket->SendText("#YVER;");
                    ListView1->Items->Item[GlobalNick.ToInt()]->Caption = s.SubString(1, s.Pos(";") - 1);
                    ListView1->ItemIndex = ListView1->Items->Count - 1;
                    Temp1 = false;
                    }
                if (Temp1 == true)
                    {
                    Socket->SendText("#EPAS;");
                    Memo1->Lines->Add(DateToStr(Date()) + ", " + TimeToStr(Time()) + " -- Попытка зайти с неверным паролем или логином (" + s.SubString(1, s.Pos(";") - 1) + ")");
                    ArchLog(" -- Попытка зайти с неверным паролем или логином (" + s.SubString(1, s.Pos(";") - 1) + ")", false, false);
                    WindAdd(Sender, "Попытка зайти с неверным паролем или логином (" + s.SubString(1, s.Pos(";") - 1) + ")", bfWarning);
                    Socket->Close();
                    }
                }
            //GlobalNick.~AnsiString();
            }
        ...
                    }
                Socket->SendText("#GPAS;");
                ArchLog(" -- >> \"#GPAS\", пользователю " + ListView1->Items->Item[GlobalNick.ToInt()]->Caption, false, true);
                Memo1->Lines->Add(DateToStr(Date()) + ", " + TimeToStr(Time()) + " -- Клиентская часть ОК! (" + s + ")");
                }
            else
                {
                Memo1->Lines->Add(DateToStr(Date()) + ", " + TimeToStr(Time()) + " -- Сделана попытка подключится с клиентской части ниже 4310 (" + s + ")");
                Socket->SendText("#MESS;Данная версия клиентской части не подходит к этой версии серверной части\nОбновите клиентскую часть!!!");
                Socket->Close();
                }
            }
        }
    ...
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог