ProcessMessage(AThread.Connection, AThread.Connection.ReadLn);
end;
procedure TfrmServer.TCPServerConnect(AThread: TIdPeerThread);
begin
//ΠΠΎΠΏΡΡΠ°Π΅ΠΌΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
if (AddClient(AThread.Connection)) then
//ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΠΈΡΠ»Π°ΡΡ ΡΠ²ΠΎΠ΅ ΠΈΠΌΡ
ProcessMessage(AThread.Connection, AThread.Connection.ReadLn)
else
begin
//ΠΠ΅Ρ ΠΌΠ΅ΡΡΠ° Π΄Π»Ρ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
AThread.Connection.WriteLn(\'error:ΠΠΎΡΡΠΈΠ³Π½ΡΡΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅
ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ \' + \'ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ. ΠΠ·Π²ΠΈΠ½ΠΈΡΠ΅, Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠ½ΡΡΡ Π²Π°Ρ
Π² ΡΠ°Π·Π³ΠΎΠ²ΠΎΡ.\');
AThread.Connection.Socket.Close;
end;
end;
procedure TfrmServer.TCPServerDisconnect(AThread: TIdPeerThread);
var clDisconnected: client; //Π‘ΡΡΡΠΊΡΡΡΠ° Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ΠΎΠ±
//ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΠΎΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠ΅ (Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Ρ
//ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ»Ρ strName ΠΈ strIP)
begin
//Π£Π΄Π°Π»ΠΈΠΌ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠ± ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΠΎΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠ΅
clDisconnected := DeleteClient(AThread.Connection);
if (clDisconnected.strName <> \'\')then
begin
//Π‘ΠΎΠΎΠ±ΡΠΈΠΌ ΠΎ ΡΠΎΠ±ΡΡΠΈΠΈ ΠΎΡΡΠ°Π»ΡΠ½ΡΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ
SendAll(\'deluser:\' + clDisconnected.strName);
SendAll(\'ΠΠ°Ρ ΠΏΠΎΠΊΠΈΠ½ΡΠ» Β«\' + clDisconnected.strName + \'Β».β);
//ΠΠΎΠ±Π°Π²ΠΈΠΌ ΡΠΎΠ±ΡΡΠΈΠ΅ Π² ΠΆΡΡΠ½Π°Π»
if (REPORT) then AddEvent(\'ΠΡΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΠ»ΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ "\' +
clDisconnected.strName + \'" Π½Π° ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ΅ "\' +
clDisconnected.strIP + \'"\');
end;
end;
procedure TfrmServer.FormCreate(Sender: TObject);
begin
//Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΡΡ ΡΠ΅ΠΊΡΠΈΡ
section := TCriticalSection.Create;
end;
ΠΠ΅ΡΠ²Π°Ρ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΠΈΠ· ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΡ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 11.9 ΠΏΡΠΎΡΠ΅Π΄ΡΡ Π½Π΅ ΠΈΠΌΠ΅ΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΊ ΡΠ°Π±ΠΎΡΠ΅ TCP-ΡΠ΅ΡΠ²Π΅ΡΠ°. ΠΡΠΎΡΠ΅Π΄ΡΡΠ° Tf rmServer. TimerlTimer Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· ΠΏΡΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΠΈ ΡΠ°ΠΉΠΌΠ΅ΡΠ° Timer 1. Π Π½Π΅ΠΉ, ΠΈΡΡ ΠΎΠ΄Ρ ΠΈΠ· Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ SERVERVISIBLE, ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ (ΠΈΠ»ΠΈ Π½Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ) ΡΠΊΡΡΡΠΈΠ΅ ΠΎΠΊΠ½Π° ΡΠ΅ΡΠ²Π΅ΡΠ°. ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ SERVERVISIBLE (ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ REPORT) ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ Π² ΠΌΠΎΠΌΠ΅Π½Ρ Π·Π°ΠΏΡΡΠΊΠ° ΡΠ΅ΡΠ²Π΅ΡΠ°.
ΠΡΠΎΡΠ΅Π΄ΡΡΠ° Tf rmServer. FormCreate ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ ΠΎΡΡΠ°Π»ΡΠ½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ ΠΈ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ°ΠΌΠΈ Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΎΠ±ΡΠΈΠΌ Π΄Π°Π½Π½ΡΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² (Π²Π΅Π΄Ρ ΡΠ΅ΡΠ²Π΅Ρ-ΡΠΎ Ρ Π½Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΠΉ).
ΠΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠΈ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π΄Π»Ρ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠ΅ΡΠ²Π΅ΡΠ° Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌΠΈ. ΠΠ°ΠΊ Π±ΡΠ»ΠΎ ΡΠΊΠ°Π·Π°Π½ΠΎ ΡΠ°Π½Π΅Π΅, ΡΠ΅ΡΠ²Π΅Ρ Ρ ΡΠ°Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΡ ΠΊ Π½Π΅ΠΌΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°Ρ . Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΠΌ ΡΡΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠ°ΡΡΠΈΠ² ΡΡΡΡΠΊΡΡΡ (ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½ΠΈΠΆΠ΅). ΠΠ΄Π΅ΡΡ ΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΠΏΡΠΈ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΈ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° (ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° Tf rmServer. TCPServerConnect) ΠΏΡΠ΅Π΄ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅ΡΡΡ ΠΏΠΎΠΏΡΡΠΊΠ° Π½Π°ΠΉΡΠΈ Π΄Π»Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ Π½ΠΎΠ²ΠΎΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ ΠΌΠ΅ΡΡΠΎ Π² ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ ΠΌΠ°ΡΡΠΈΠ²Π΅ (Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΡΠ€^Π‘ΠΠ΅ΠΏ^. ΠΡΠ»ΠΈ ΠΌΠ΅ΡΡΠΎ Π½Π°ΡΠ»ΠΎΡΡ, ΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ AddClient Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ True, ΠΈ ΡΠ΅ΡΠ²Π΅Ρ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡ Π² ΡΠ΅ΠΆΠΈΠΌ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. ΠΠ»Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΈΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ (ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Ρ ΠΏΡΠ΅ΡΠΈΠΊΡΠΎΠΌ name:).
ΠΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ° Π½Π° ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ (ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° Tf rmServer. TCPServerDisconnect) ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎ, ΡΡΠΎ, ΠΏΠΎΠΌΠΈΠΌΠΎ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎΠ± ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΠ²ΡΠ΅ΠΌΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ΅ (Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ DeleteClient), Π²ΡΠ΅ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ ΡΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡΡΡΡ ΠΎΠ± ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΈ ΡΠΎΠ±Π΅ΡΠ΅Π΄Π½ΠΈΠΊΠ° (Π²ΡΠ·ΠΎΠ²Ρ ΡΡΠ½ΠΊΡΠΈΠΈ SendAll).
ΠΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° (ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° Tf rmServer. Execute) ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ProcessMessage, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅ΡΡΡ Π°Π½Π°Π»ΠΈΠ·ΠΎΠΌ ΡΠ΅ΠΊΡΡΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ΅ΡΠ²Π΅Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ.
Π’Π΅ΠΏΠ΅ΡΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΡΠΌΠΎ ΠΈΠ»ΠΈ ΠΊΠΎΡΠ²Π΅Π½Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠΌΠΈ Π²ΡΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ ΠΈ Π½Π° ΠΊΠΎΡΠΎΡΡΡ ΠΏΠΎ Π±ΠΎΠ»ΡΡΠ΅ΠΉ ΡΠ°ΡΡΠΈ ΠΈ ΠΎΡΠ½ΠΎΠ²ΡΠ²Π°Π΅ΡΡΡ ΡΠ°Π±ΠΎΡΠ° ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π§Π°ΡΡΡ ΡΠ°ΠΉΠ»Π° Unitl.pas, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ°Ρ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΈΠΏΠΎΠ² Π΄Π°Π½Π½ΡΡ , ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ (Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΠ΅ Π²ΡΡΡΠ½ΡΡ), ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½Ρ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ°, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 11.10.
...ΠΠΈΡΡΠΈΠ½Π³ 11.10.
Π’ΠΈΠΏΡ Π΄Π°Π½Π½ΡΡ ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (Unitl.pas)
unit Unit1;
interface
uses
β¦, SyncObjs;
type
TfrmServer = class(TForm)
lstEvents: TListBox; //Π‘ΠΏΠΈΡΠΎΠΊ ΡΠΎΠ±ΡΡΠΈΠΉ
β¦
end;
var
frmServer: TfrmServer;
REPORT: Boolean; //ΠΡΠ»ΠΈ = True, ΡΠΎ Π²ΡΠ΅ ΡΠΎΠ±ΡΡΠΈΡ
//Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π² ListBox
//ΠΎΠΊΠ½Π° ΡΠ΅ΡΠ²Π΅ΡΠ°
SERVERVISIBLE: Boolean; //ΠΡΠ»ΠΈ = True, ΡΠΎ ΠΎΠΊΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ
//Π½Π° ΡΠΊΡΠ°Π½Π΅ ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΅ΡΡΡ
//Π½Π° ΠΠ°Π½Π΅Π»ΠΈ Π·Π°Π΄Π°Ρ
implementation
//Π‘Π»Π΅Π΄ΡΡΡΠ°Ρ ΡΡΡΡΠΊΡΡΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ
//ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅, ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ²ΡΠ΅ΠΌΡΡ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ
type
client = record
fUsed: Boolean; {Π―ΡΠ΅ΠΉΠΊΠ° Π·Π°Π½ΡΡΠ°}
fNamed: Boolean; {ΠΠ»ΠΈΠ΅Π½Ρ ΡΠΎΠΎΠ±ΡΠΈΠ» ΡΠ²ΠΎΠ΅ ΠΈΠΌΡ}
strName: string; {ΠΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ}
strIP: string; {IP-Π°Π΄ΡΠ΅Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°}
Connection: TIdTCPServerConnection; {Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ}
end;
const
MAX_CLIENT = 100;//ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠ½ΠΈΠ΅Π½ΡΠΎΠ²
var
clients: array [1..MAX_CLIENT] of client;//ΠΠ°ΡΡΠΈΠ² ΡΠΎ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡΠΌΠΈ ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°Ρ
section: TCriticalSection; //ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ΅ΠΊΡΠΈΡ Π΄Π»Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ²
ΠΡΠΎΡΠ΅Π΄ΡΡΠ°, Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΠ°Ρ ΡΠΎΠ±ΡΡΠΈΠ΅ Π² ΠΆΡΡΠ½Π°Π» (ListBox Π½Π° ΡΠΎΡΠΌΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ°), ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 11.11.
...ΠΠΈΡΡΠΈΠ½Π³ 11.11.
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΠ±ΡΡΠΈΡ Π² ΠΆΡΡΠ½Π°Π» ΡΠ΅ΡΠ²Π΅ΡΠ°
procedure AddEvent(strEvent: string);
begin
section.Enter;
frmServer.lstEvents.Items.Append(strEvent);
section.Leave;
end;
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 11.12 ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ°, ΡΠ°ΡΡΡΠ»Π°ΡΡΠ°Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅ΠΌ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΠΌ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ.
...ΠΠΈΡΡΠΈΠ½Π³ 11.12.
Π Π°ΡΡΡΠ»ΠΊΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ
procedure SendAll(strMessage: string);
var
i: Integer;
begin
for i:=1 to MAX_CLIENT do
if (clients[i].fNamed)then
begin
try
clients[i].Connection.WriteLn(strMessage);
except
//ΠΡΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΎΡΠΊΠ»ΡΡΠΈΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
//ΠΈ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ ΡΠ°ΡΡΡΠ»ΠΊΡ
ErrorCloseConnection(clients[i].Connection);
end;
end;
end;
ΠΠ°Π»Π΅Π΅, Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 11.13, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ°, ΠΏΠΎΡΡΠ»Π°ΡΡΠ°Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ strMessage ΠΊΠ»ΠΈΠ΅Π½ΡΡ Ρ Π·Π°Π΄Π°Π½Π½ΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ strName.
...ΠΠΈΡΡΠΈΠ½Π³ 11.13.
ΠΠΎΡΡΠ»ΠΊΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ Ρ Π·Π°Π΄Π°Π½Π½ΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ
procedure SendTo(strMessage: string; strName: string);
var
i: Integer;
begin
for i:=1 to MAX_CLIENT do
if (clients[i].fNamed)then
if (clients[i].strName = strName) then
//ΠΠ°ΡΠ»ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Ρ Π·Π°Π΄Π°Π½Π½ΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ
try
clients[i].Connection.WriteLn(strMessage);
except
//ΠΡΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΎΡΠΊΠ»ΡΡΠΈΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
//ΠΈ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ ΡΠ°ΡΡΡΠ»ΠΊΡ
ErrorCloseConnection(clients[i].Connection);
end;
end;
ΠΡΠΎΡΠ΅Π΄ΡΡΠ°, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 11.14, Π½Π°Ρ ΠΎΠ΄ΠΈΡ ΠΈ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ ΠΊΠ°ΠΊ Π·Π°Π½ΡΡΡΡ Π΄Π»Ρ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π·Π°ΠΏΠΈΡΡ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ clients. ΠΡΠ»ΠΈ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ Π½Π΅ ΠΎΡΡΠ°Π»ΠΎΡΡ, ΡΠΎ Π΄ΠΎΡΡΠΈΠ³Π½ΡΡΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ.
...ΠΠΈΡΡΠΈΠ½Π³ 11.14.
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ Π½ΠΎΠ²ΠΎΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠ΅
function AddClient(Connection: TIdTCPServerConnection): Boolean;
var
i: Integer;
begin
section.Enter;
for i:=1 to MAX_CLIENT do
begin
if (not clients[i].fUsed) then
begin
//ΠΠ°ΡΠ»ΠΈ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΡ Π·Π°ΠΏΠΈΡΡ β Π·Π°ΠΏΠΎΠ»Π½ΠΈΠΌ Π΅Π΅
//(ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΏΠΎΠΊΠ° Π±Π΅Π·ΡΠΌΡΠ½Π½ΡΠΉ)
clients[i].fUsed := True;
clients[i].Connection := Connection;
clients[i].strIP := Connection.Socket.Binding.PeerIP;
AddClient := True;
section.Leave;
Exit;
end;
end;
section.Leave;
AddClient := False;
end;
ΠΡΠΎΡΠ΅Π΄ΡΡΠ° DeleteClient, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 11.15, ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ Π·Π°ΠΏΠΈΡΡ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ clients.
...ΠΠΈΡΡΠΈΠ½Π³ 11.15. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ΅
function DeleteClient(Connection: TIdTCPServerConnection):client;
var
i: Integer;
begin
section.Enter;
for i:=1 to MAX_CLIENT do
if (clients[i].fUsed) then
if (clients[i].Connection = Connection) then
begin
//ΠΠΎΡ ΠΎΠ½Π° β Π·Π°ΠΏΠΈΡΡ ΠΎ Π½ΡΠΆΠ½ΠΎΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠ΅
clients[i].fUsed := False;
clients[i].fNamed := False;
clients[i].Connection := Nil;
DeleteClient := clients[i];
clients[i].strName := \'\
clients[i].strIP := \'\
section.Leave;
Exit;
end;
end;
ΠΡΠΎΡΠ΅Π΄ΡΡΠ° SendClientList, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 11.16, ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ (ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π²ΡΠ΅Π³ΠΎΡΡ) ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ addclient: Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π½Π΅Π΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
...ΠΠΈΡΡΠΈΠ½Π³ 11.16.
ΠΠΎΡΡΠ»ΠΊΠ° ΡΠΏΠΈΡΠΊΠ° Π²ΡΠ΅Ρ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ²
procedure SendClientList(Connection: TIdTCPServerConnection);
var
i: Integer;
begin
for i:= 1 to MAX_CLIENT do
if (clients[i].fNamed) then
if (clients[i].Connection <> Connection) then
try
//Π‘ΠΎΠΎΠ±ΡΠΈΠΌ ΠΈΠΌΡ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ³ΠΎ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
Connection.WriteLn(\'adduser:\' + clients[i].strName);
except
//ΠΡΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΎΡΠΊΠ»ΡΡΠΈΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
//ΠΈ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ ΡΠ°ΡΡΡΠ»ΠΊΡ
ErrorCloseConnection(clients[i].Connection);
end;
end;
ΠΡΠΎΡΠ΅Π΄ΡΡΠ° ErrorCloseConnection (Π»ΠΈΡΡΠΈΠ½Π³ 11.17) Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ ΠΎΡΠΈΠ±ΠΊΠ΅ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ Π½Π°ΡΡΡΠ΅Π½ΠΈΠΈ ΡΠ΅ΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ). ΠΠ½Π° ΠΎΡΠΊΠ»ΡΡΠ°Π΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ ΠΊΠΎΡΠΎΡΡΠΌ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌΠΈ, ΠΈ ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ ΠΎΠ± ΡΡΠΎΠΌ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ.
...ΠΠΈΡΡΠΈΠ½Π³ 11.17.
ΠΠ°ΠΊΡΡΡΠΈΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ (ΠΏΡΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΎΡΠΈΠ±ΠΊΠΈ)
procedure ErrorCloseConnection(Connection: TIdTCPServerConnection);
var
clError: client; //ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅, ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅
//Ρ ΠΊΠΎΡΠΎΡΡΠΌ ΠΏΡΠ΅ΡΠ²Π°Π»ΠΎΡΡ (ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠΌΡ ΠΈ IP)
begin
//ΠΡΠΊΠ»ΡΡΠΈΠΌ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅, ΡΠ°Π±ΠΎΡΠ°ΡΡΠ΅Π΅ Ρ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌΠΈ
clError := DeleteClient(Connection);
//Π‘ΠΎΠΎΠ±ΡΠΈΠΌ ΠΎΠ± ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΎΡΡΠ°Π»ΡΠ½ΡΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ
SendAll(\'deluser:\' + clError.strName);
SendAll(\'ΠΠ°Ρ ΠΏΠΎΠΊΠΈΠ½ΡΠ» Β«\' + clError.strName + \'Β».β);
//ΠΠΎΠ±Π°Π²ΠΈΠΌ ΡΠΎΠ±ΡΡΠΈΠ΅ Π² ΠΆΡΡΠ½Π°Π»
if (REPORT) then AddEvent(\'ΠΠ·-Π·Π° ΠΎΡΠΈΠ±ΠΊΠΈ ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ ΠΊΠ»ΠΈΠ΅Π½Ρ "\' +
clError.strName + \'" Π½Π° ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ΅ Β«\' + clError.strIP + \'Β»\');
end;
ΠΡΠΎΡΠ΅Π΄ΡΡΠ° RegisterClient, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 11.18, ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠ΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠΎΠ΄ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΌ Π² ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΈ name: ΠΈΠΌΠ΅Π½Π΅ΠΌ (ΡΠ°Π½Π΅Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ»Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ AddClient, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π°ΡΠ»Π° Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠ΅ΡΡΠΎ Π² MaccHBeclients). ΠΡΠ»ΠΈ ΠΈΠΌΡ, ΠΏΠΎΠ΄ ΠΊΠΎΡΠΎΡΡΠΌ Ρ ΠΎΡΠ΅Ρ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΡΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ, ΡΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΏΠΎΡΡΠ»Π°Π΅ΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΡΠ°Π·ΡΡΠ²Π°Π΅ΡΡΡ.
...ΠΠΈΡΡΠΈΠ½Π³ 11.18.
Π Π΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
procedure RegisterClient(Connection: TIdTCPServerConnection;