TServerSocket, работа с несколькими клиентами
Код:
ServerSocket1->Socket->Connections[0]->SendText("Text String");
Код выше отправляет клиенту, индекс соединения которого равен 0 текстовую строку. Как грамотно построить обслуживание более одного клиента? Т.е. как при получении сообщения от клиента (обработка события OnClientRead), получить индекс соединения.
Цитата: Valar
Вопрос по специфики использования класса TServerSocket.
вот я веду учет подключенных пользователей:
Код выше отправляет клиенту, индекс соединения которого равен 0 текстовую строку. Как грамотно построить обслуживание более одного клиента? Т.е. как при получении сообщения от клиента (обработка события OnClientRead), получить индекс соединения.
вот я веду учет подключенных пользователей:
Код:
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);
//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();
}
}
}
...
}
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();
}
}
}
...
}