procedure RegisterClient(Connection: TIdTCPServerConnection;
strName: string);
var
i: Integer;
begin
//ΠΡΠΎΠ²Π΅ΡΠΈΠΌ, ΡΡΠΎΠ±Ρ ΠΈΠΌΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π΅ΡΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΎΡΡ
for i:=1 to MAX_CLIENT do
begin
if (clients[i].fNamed) then
if (clients[i].strName = strName) then
begin
//ΠΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ β ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΡΠ°Π·ΡΡΠ²Π°ΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅
Connection.WriteLn(\'error:ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ "\' +
strName + \'" ΡΠΆΠ΅ ΡΡΠ°ΡΡΠ²ΡΠ΅Ρ Π² ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΠ΅.β);
DeleteClient(Connection);
Connection.Socket.Close;
Exit;
end;
end;
//ΠΠΎΠΈΡΠΊ Π·Π°ΠΏΠΈΡΠΈ ΠΎ Π½ΡΠΆΠ½ΠΎΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠ΅ ΠΈ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ Π΅ΠΌΡ ΠΈΠΌΠ΅Π½ΠΈ
for i:=1 to MAX_CLIENT do
begin
if (not clients[i].fNamed and clients[i].fUsed) then
if (clients[i].Connection = Connection) then
begin
//ΠΠΎΡ ΠΎΠ½, Π½Π°Ρ ΠΊΠ»ΠΈΠ΅Π½Ρβ¦
clients[i].fNamed := True;
clients[i].strName := strName;
//Π‘ΠΎΠΎΠ±ΡΠΈΠΌ Π΄ΡΡΠ³ΠΈΠΌ ΠΎ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠ°
SendAll(\'adduser:\' + strName);
SendAll(\'text:Π Π½Π°ΠΌ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΠ»ΡΡ "\' + strName +
\'". ΠΠΎΠΏΡΠΈΠ²Π΅ΡΡΡΠ²ΡΠ΅ΠΌ!\');
//ΠΡΡΡΠ»Π°Π΅ΠΌ Π½ΠΎΠ²ΠΎΠΌΡ ΠΊΠ½ΠΈΠ΅Π½ΡΡ ΡΠΏΠΈΡΠΎΠΊ ΠΎΡΡΠ°Π»ΡΠ½ΡΡ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ²
//ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΠ°
SendClientList(Connection);
//Π Π°Π·ΡΠ΅ΡΠΈΠΌ Π½ΠΎΠ²ΠΎΠΌΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΠΎΡΡΡΠ»Π°ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ
Connection.WriteLn(\'ok:\');
//ΠΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ, ΡΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠΎΠ±ΡΡΠΈΠ΅ Π² ΡΠΏΠΈΡΠΎΠΊ
if (REPORT) then AddEvent(\'ΠΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ ΠΊΠ»ΠΈΠ΅Π½Ρ "\' +
strName + \'" Π½Π° ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ΅ "\' +
Connection.Socket.Binding.PeerIP + \'"\');
end;
end;
end;
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 11.19 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° ΡΠ»ΡΠΆΠ΅Π±Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠ°Ρ ΠΈΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡ TIdTCPServerConnection, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΡΡΠΎΠΌΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ.
...ΠΠΈΡΡΠΈΠ½Π³ 11.19.
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΏΠΎ Π΅Π³ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ
function GetClientName(Connection: TIdTCPServerConnection):string;
var
i: Integer;
begin
for i:=1 to MAX_CLIENT do
if (clients[i].fNamed) then
if (clients[i].Connection.Socket.Binding.Handle =
Connection.Socket.Binding.Handle) then
begin
GetClientName := clients[i].strName;
Exit;
end;
end;
Π, Π½Π°ΠΊΠΎΠ½Π΅Ρ, Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 11.20 ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ Π³Π»Π°Π²Π½Π°Ρ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΠ°Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ².
...ΠΠΈΡΡΠΈΠ½Π³ 11.20.
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
procedure ProcessMessage(Connection: TIdTCPServerConnection;
strMessage: string);
var
strName: string; //ΠΠΌΡ ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ
strAction: string; //Π‘ΡΡΠΎΠΊΠ° Ρ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ (ΠΏΡΠ΅ΡΠΈΠΊΡ)
len: Integer; //ΠΠ»ΠΈΠ½Π° ΡΡΡΠΎΠΊΠΈ strAction
begin
//ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Ρ ΠΎΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ
len := Pos(\':\', strMessage);
strAction := Copy(strMessage,1,len-1);
Delete(strMessage,1,len);
if (strAction = \'name\') then
begin
//ΠΠ»ΠΈΠ΅Π½Ρ ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ ΡΠ²ΠΎΠ΅ ΠΈΠΌΡ β ΠΏΡΡΠ°Π΅ΠΌΡΡ Π΅Π³ΠΎ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ
RegisterClient(Connection, strMessage);
end
else if (strAction = \'text\') then
begin
//ΠΠ»ΠΈΠ΅Π½Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅ΠΌ β ΠΏΠΎΠ΄ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΎΡΠΎΡΠ»Π΅ΠΌ
strMessage := GetClientName(Connection) + \': \' + strMessage;
SendAll(\'text:\' + strMessage);
//ΠΡΠ»ΠΈ Π½Π°Π΄ΠΎ, ΡΠΎ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π² ΡΠΏΠΈΡΠΊΠ΅ ΡΠΎΠ±ΡΡΠΈΠΉ
if (REPORT) then AddEvent(\'Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΡ \' + strMessage);
end
else
begin
//ΠΠ»ΠΈΠ΅Π½Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡ ΡΠΎΠ±Π΅ΡΠ΅Π΄Π½ΠΈΠΊΡ
//(ΡΡΡΠΎΠΊΠ° strAction ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΈΠΌΡ ΡΠΎΠ±Π΅ΡΠ΅Π΄Π½ΠΈΠΊΠ°)
strName := GetClientName(Connection);
SendTo(\'text:\' + strName + \': \' + strMessage, strAction);
if (strName <> strAction) then
//ΠΠ΅ΡΠ΅Π΄Π°Π΄ΠΈΠΌ ΠΊΠΎΠΏΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Ρ
Connection.WriteLn(\'text:\' + strName + \' Π΄Π»Ρ \' +
strAction + \': \' + strMessage);
//ΠΡΠ»ΠΈ Π½Π°Π΄ΠΎ, ΡΠΎ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π² ΡΠΏΠΈΡΠΊΠ΅ ΡΠΎΠ±ΡΡΠΈΠΉ
if (REPORT) then AddEvent(\'Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ \' + strAction +
\' ΠΎΡ \' + strName + \': \' + strMessage);
end;
end;
ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ (ΡΡΠ°ΡΡΠ½ΠΈΠΊΠ΅ ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΠ°) Ρ ΡΠ°Π½ΠΈΡΡΡ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΠ΅ client:
...type
client = record
fUsed: Boolean; {Π―ΡΠ΅ΠΉΠΊΠ° Π·Π°Π½ΡΡΠ°}
fNamed: Boolean; {ΠΠ»ΠΈΠ΅Π½Ρ ΡΠΎΠΎΠ±ΡΠΈΠ» ΡΠ²ΠΎΠ΅ ΠΈΠΌΡ}
strName: string; {ΠΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ}
strIP: string; {IP-Π°Π΄ΡΠ΅Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°}
Connection: TIdTCPServerConnection; {Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ}
end;
ΠΠ΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΊ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈΠΌΠ΅ΡΡ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ ΡΡΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ ΠΏΠΎΠ»Ρ ΡΡΡΡΠΊΡΡΡΡ. Π‘Π°ΠΌΡΠΌ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌ ΠΈΠ· Π½ΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΡΠ»ΠΊΠ° Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡ TIdTCPServerConnection, Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ΅ΡΠ²Π΅Ρ ΠΌΠΎΠΆΠ΅Ρ Π² Π»ΡΠ±ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠ±ΠΎ Π²ΡΠ΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡ Ρ ΡΠ°Π½ΠΈΡΡΡ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ clients. ΠΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅Ρ ΠΎΡΠ³Π°Π½ΠΈΡΠ΅Π½ (ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° MAXCLIENT) ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ β ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ² ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΠ°. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΌΠ°ΡΡΠΈΠ² Ρ ΠΏΠΎΡΡΠΎΡΠ½Π½ΡΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠ»Π°Π³ (ΠΏΠΎΠ»Π΅ f Used) Π΄Π»Ρ ΠΈΠ½Π΄ΠΈΠΊΠ°ΡΠΈΠΈ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΡΡΠ΅ΠΉΠΊΠ° ΠΌΠ°ΡΡΠΈΠ²Π° Π·Π°Π½ΡΡΠ° (Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ True) ΠΈΠ»ΠΈ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½Π° (Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ False). ΠΠΎΠ»Π΅ fName ΡΡΡΡΠΊΡΡΡΡ client ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΈΠΊΡΠ°ΡΠΈΠΈ ΡΠ°ΠΊΡΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ (ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π΅Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π½Π΅ ΠΏΠΎΠ»ΡΡΠ°ΡΡ). ΠΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Ρ fNamed ΡΠ°Π²Π½ΠΎ False ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Π² True, ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ ΠΈΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΎ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ² ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΠ°.
ΠΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠ°ΠΌΡΡ ΡΠ»ΠΎΠΆΠ½ΡΡ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠ² ΡΠ°Π±ΠΎΡΡ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΌΠ°ΡΡΠΈΠ²Ρ clients. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ΅ΠΊΡΠΈΡ. ΠΠ½Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΡΠΎΠ±ΡΡΠΈΠΉ Π² ΡΠΏΠΈΡΠΎΠΊ IstEvents ΡΠ΅ΡΠ²Π΅ΡΠ°.
Π, Π½Π°ΠΊΠΎΠ½Π΅Ρ, ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ°. Π§ΡΠΎΠ±Ρ ΡΠ΅ΡΠ²Π΅Ρ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ Ρ ΠΎΡΠΊΠ»ΡΡΠ΅Π½Π½ΡΠΌ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΎΠ±ΡΡΠΈΠΉ, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΡΠΎΠ±Ρ ΠΎΠΊΠ½ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ° Π½Π΅ ΠΌΠ΅ΡΠ°Π»ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΌΠΎΠΆΠ½ΠΎ Ρ ΡΠ°Π½ΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ REPORT ΠΈ SERVERVISIBLE Π² INI-ΡΠ°ΠΉΠ»Π΅. Π’Π°ΠΊ, ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, ΠΈ ΡΠ΄Π΅Π»Π°Π½ΠΎ: Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΡΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Ρ ΡΠ°Π½ΡΡΡΡ Π² ΡΠ΅ΠΊΡΠΈΠΈ [Common] ΡΠ°ΠΉΠ»Π° Server. ini. ΠΠ»Ρ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΈΠ· INI-ΡΠ°ΠΉΠ»Π° ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΊΠΎΠ΄ Π² ΠΌΠΎΠ΄ΡΠ»Π΅ Server (ΡΠ°ΠΉΠ» Server. dpr) ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ (Π»ΠΈΡΡΠΈΠ½Π³ 11.21).
...ΠΠΈΡΡΠΈΠ½Π³ 11.21. ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΠΌΠΎΠ΄ΡΠ»Π΅ Server
program Server;
uses
Forms,
Unit1 in \'Unit1.pas\' {frmServer},
IniFiles, Dialogs;
{$R *.res}
var
{ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΈΠ· INI-ΡΠ°ΠΉΠ»Π°}
config: TIniFile;
strPath: string;
begin
//ΠΡΡΠ·ΠΈΠΌ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈΠ· INI-ΡΠ°ΠΉΠ»Π°
strPath :=
Copy(Application.ExeName,1,Length(Application.ExeName)β3) +
\'ini\
config := TIniFile.Create(strPath);
SERVERVISIBLE := config.ReadBool(\'Common\', \'ServerVisible\',
False);
REPORT := config.ReadBool(\'Common\',βEventReportβ, False);
config.Free ;
try
//ΠΠ°ΠΏΡΡΠΊ ΡΠ΅ΡΠ²Π΅ΡΠ°
Application.Initialize;
Application.CreateForm(TfrmServer, frmServer);
Application.Run;
except
MessageDlg(\'ΠΠ΅ ΡΠ΄Π°Π΅ΡΡΡ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠ΅ΡΠ²Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ. \' +
\'ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΎΠ½ Π±ΡΠ» Π·Π°ΠΏΡΡΠ΅Π½ ΡΠ°Π½Π΅Π΅.\', mtError, [mbOK], 0);
end;
end.
Π ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π»ΠΈΡΡΠΈΠ½Π³Π΅ ΠΊΠΎΠ΄ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΎΡΠΌΡ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ Π² Π±Π»ΠΎΠΊ try. Π‘Π΄Π΅Π»Π°Π½ΠΎ ΡΡΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ΅ΡΠ²Π΅Ρ Π½Π΅ Β«ΠΏΠ°Π΄Π°Π»Β» Ρ Π²ΡΠ΄Π°ΡΠ΅ΠΉ Π²ΡΠ΅ΠΌ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΎ Π·Π½Π°ΠΊΠΎΠΌΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠΎ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠ΅ ΠΏΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ΅ ΠΎΡΠΈΠ±ΠΎΡΠ½ΠΎΠ³ΠΎ Π·Π°ΠΏΡΡΠΊΠ° ΡΠ²ΠΎΠ΅ΠΉ ΠΊΠΎΠΏΠΈΠΈ.
Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, INI-ΡΠ°ΠΉΠ» Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΡΠ΅ΡΠ²Π΅ΡΠ° Ρ Π²ΠΈΠ΄ΠΈΠΌΡΠΌ ΠΎΠΊΠ½ΠΎΠΌ ΠΈ Π²ΠΊΠ»ΡΡΠ΅Π½Π½ΡΠΌ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈΠΌΠ΅Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π²ΠΈΠ΄:
...[Common]
ServerVisible=1
EventReport=1
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
ΠΡΠΎΠ΅ΠΊΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΠΌΠ΅Π΅Ρ ΠΈΠΌΡ Client. ΠΠ½Π΅ΡΠ½ΠΈΠΉ Π²ΠΈΠ΄ ΡΠΎΡΠΌΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π΅Π³ΠΎ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ Π½Π° ΡΠΈΡ. 11.7.
ΠΡΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π½Π° ΡΠΈΡ. 11.7 ΡΠΎΡΠΌΠ° ΠΈΠΌΠ΅Π΅Ρ ΠΈΠΌΡ frmClient. Π‘Π²ΠΎΠΉΡΡΠ²Π° (ΡΠΎΠ»ΡΠΊΠΎ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ) ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Π½ΡΡ Π½Π° ΡΠΎΡΠΌΡ, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Ρ Π² ΡΠ°Π±Π». 11.2.
Π ΠΈΡ. 11.7. Π€ΠΎΡΠΌΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΏΡΠΈ Π²Π΅Π΄Π΅Π½ΠΈΠΈ ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΠ°
Π’Π°Π±Π»ΠΈΡΠ° 11.2.
Π‘Π²ΠΎΠΉΡΡΠ²Π° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠΎΡΠΌΡ frmClient
ΠΠ°Π»Π΅Π΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ, Π½Π΅ ΡΠ²Π»ΡΡΡΠΈΠ΅ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ, Π½ΠΎ ΠΈΠΌΠ΅ΡΡΠΈΠ΅ Π±ΠΎΠ»ΡΡΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΡΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 11.22 ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ ΡΠΎΡΠΌΡ ΠΏΡΠΈ ΡΠ΄Π°ΡΠ½ΠΎΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ....ΠΠΈΡΡΠΈΠ½Π³ 11.22.
ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΡΠΌΡ ΠΏΡΠΈ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΈ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ
procedure Connect();
begin
with frmClient do
begin
cmbConnect.Caption := \'ΠΡΠΊΠ»ΡΡΠΈΡΡΡΡ\
txtUser.Enabled := False;
txtServer.Enabled := False;
Caption := \'Π Π°Π·Π³ΠΎΠ²ΠΎΡΠ½ΠΈΠΊ [\' + txtUser.Text + \' ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ ΠΊ \' +
txtServer.Text + \']\
lstUsers.Enabled := True;
cmbSend.Enabled := True;
txtMessage.Enabled := True;
txtChat.Enabled := True;
end;
end;
ΠΡΠΎΡΠ΅Π΄ΡΡΠ° Disconnect, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 11.23, ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ ΡΠΎΡΠΌΡ ΠΏΡΠΈ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ° (Π² ΡΠ°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅ ΡΠΎΡΠΌΠ° frmClient ΠΏΡΠ΅Π΄ΡΡΠ°Π΅Ρ ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΠΎ).
...ΠΠΈΡΡΠΈΠ½Π³ 11.23.
ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΡΠΌΡ ΠΏΡΠΈ ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΈ ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ°
procedure Disconnect();
begin
with frmClient do
begin
cmbConnect.Caption := \'ΠΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡ\
txtUser.Enabled := True;
txtServer.Enabled := True;
Caption := \'Π Π°Π·Π³ΠΎΠ²ΠΎΡΠ½ΠΈΠΊ\
lstUsers.Enabled := False;
lstUsers.Clear;
cmbSend.Enabled := False;
txtMessage.Enabled := False;
txtChat.Enabled := False;
end;
end;
ΠΡΠΎΡΠ΅Π΄ΡΡΠ° ProcessMessage (Π»ΠΈΡΡΠΈΠ½Π³ 11.24) ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ΅ ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ°, Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ΅ Π² ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ (Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ, ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈ ΡΠ΅Π°ΠΊΡΠΈΡ Π½Π° Π½ΠΈΡ ΠΎΡΠ»ΠΈΡΠ½Ρ ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΡ ).
...ΠΠΈΡΡΠΈΠ½Π³ 11.24.
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΡΡΠΎΠΊΠΈ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠΉ ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ°
procedure ProcessMessage(strMessage: string);
var
strAction: string; //Π’ΠΈΠΏ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ (ΠΏΡΠ΅ΡΠΈΠΊΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ)
len: Integer; //ΠΠ»ΠΈΠ½Π° ΡΡΡΠΎΠΊΠΈ strAction
begin
//ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΠΈΠΏ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΠΌ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ
len := Pos(\':\', strMessage);
strAction := Copy(strMessage,1,len-1);
Delete(strMessage,1,len);
if (strAction = \'ok\') then
begin
//Π Π΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½Π° β ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ
//ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ
Connect;
end
else if (strAction = \'error\') then
begin
//ΠΡΠΈΠ±ΠΊΠ°!!!
frmClient.TCPClient.Disconnect;
Disconnect;
MessageDlg(strMessage, mtError, [mbOK], 0);
end
else if (strAction = \'adduser\') then
begin
//Π ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΡ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΠ»ΡΡ Π½ΠΎΠ²ΡΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
frmClient.lstUsers.Items.Add(strMessage);
end
else if (strAction = \'deluser\') then
begin
//ΠΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΠ»ΡΡ
frmClient.lstUsers.Items.Delete(
frmClient.lstUsers.Items.IndexOf(strMessage));
end
else begin
//ΠΠΎΠΊΠ°ΠΆΠ΅ΠΌ ΠΏΡΠΈΠ½ΡΡΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅
frmClient.txtChat.Lines.Add(strMessage);
end;
end;
ΠΠ°Π»Π΅Π΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ, Π½Π° ΠΊΠΎΡΠΎΡΡΡ , ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, ΠΈ ΠΎΡΠ½ΠΎΠ²Π°Π½Π° ΡΠ°Π±ΠΎΡΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π½Π°ΠΆΠ°ΡΠΈΡ ΠΊΠ½ΠΎΠΏΠΊΠΈ cmbConnect, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 11.25, ΠΏΡΡΠ°Π΅ΡΡΡ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡΡΡ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ. ΠΡΠ»ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ, ΡΠΎ ΡΡΠ° ΠΆΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Π΅Π³ΠΎ ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ.