Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Indy TCPServer


Автор: Ripper 13.8.2004, 17:14
Как посчитать кол-во людей приконектившихся к серверу? Т.е. кол-во потоков? Вроде нельзя или я ошибаюсь?

Автор: Girder 13.8.2004, 22:17
IdTCPServer1.Threads.LockList.Count

Автор: Петрович 13.8.2004, 22:59
Если имеется ввиду TIdTCPServer, то у него есть свойство Threads

Автор: Ripper 13.8.2004, 23:00
а как переслать всем некий текст? Че то не пойму...
Добавлено @ 23:09
Да и вот я делаю одно приложение. Ставлю туда TidTCPServer, пишу в свойстве OnConnect
showmessage(IntToStr(idTCPServer1.Threads.LockList.Count));
И делаю клиент, тама 2 кнопки. на одну idTCPClient1.Connect(); на другую idTCPClient1.Disconnect;
Сначала запускаю сервер потомо клиент... нажимаю на кнопку происходит коннект и в сервере отображается число 1. А если запускаю второй клиент то уже не чего не происходит... почему?

Автор: Girder 13.8.2004, 23:16
Код
...
var i:integer;
      s:string;
begin
 with form3.IdTCPServer1.Threads do
  begin
   i:=LockList.Count;
   if i>0 then
    begin
     s:='Girder';
     repeat
      dec(i)
       try
        TIdPeerThread(LockList.Items[i]).Connection.OpenWriteBuffer;
        TIdPeerThread(LockList.Items[i]).Connection.Write(s);
        TIdPeerThread(LockList.Items[i]).Connection.CloseWriteBuffer;
       except
        TIdPeerThread(LockList.Items[i]).Stop;
       end;
     until (i=0);
    end;
  UnlockList;
 end;
end;

Добавлено @ 23:22
Цитата
Сначала запускаю сервер потомо клиент... нажимаю на кнопку происходит коннект и в сервере отображается число 1. А если запускаю второй клиент то уже не чего не происходит... почему?

Ripper код плиз...

Автор: Ripper 14.8.2004, 11:03
Че то проги скомпиленные постоянно виснут... сокеты намного приятнее... хм
Server:
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(IntToStr(idTCPServer1.Threads.locklist.Count));
end;

procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
     s:string;
begin
with IdTCPServer1.Threads do
 begin
  i:=LockList.Count;
  if i>0 then
   begin
    s:='test';
    repeat
     dec(i);
      try
       TIdPeerThread(LockList.Items[i]).Connection.OpenWriteBuffer;
       TIdPeerThread(LockList.Items[i]).Connection.Write(s);
       TIdPeerThread(LockList.Items[i]).Connection.CloseWriteBuffer;
      except
       TIdPeerThread(LockList.Items[i]).Stop;
      end;
    until (i=0);
   end;
 UnlockList;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
idTCPServer1.Active:=true;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
idTCPServer1.Active:=false;
end;

Client:
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
idTCPClient1.Connect();
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
idTCPClient1.Disconnect;
end;

procedure TForm1.Button3Click(Sender: TObject);
var s:string;
begin
s:=idTCPClient1.ReadLn();
showmessage(s);
end;

Порты совпадают. Открываю сервер, затем клиент (у него свойство host=127.0.01), тыркаю на кнопку Коннект, потом на сервере кнопка - кол-во клиентов = 0...
потом нажимаю отослать текст и виснет клиент

Автор: Jey_k 14.8.2004, 12:37
Отправил почтой

Автор: Петрович 14.8.2004, 13:51
Правильнее делать так, и только так (имеется ввиду использование свойства Threads):
Код
procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
    s:string;
begin
 with IdTCPServer1.Threads.LockList do try
   i:=Count;
   s:='test';
   while  i > 0  do begin
     Dec(i);
     TIdPeerThread(Items[i]).Connection.Write(s);
   end;
 finally
   IdTCPServer1.Threads.UnlockList;
 end;
end;

Дело в том, что каждому LockList должен соответствовать парный UnlockList! См. описание типа TThreadList.

Автор: Ripper 14.8.2004, 14:46
незнаю все равно ничего не получается... видимо сервер не посылает текст. Что за ошибка
Connection closed gracefully?
Кол-во клиентов равно 0 при коннекте клиента.
Вот :
Код

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
with idTCPServer1.Threads.LockList do
 try
  i:=Count;
  showmessage(inttostr(i));
 finally
idTCPServer1.Threads.UnlockList;
end;
end;


Автор: Петрович 18.8.2004, 19:46
Цитата(Ripper @ 14.8.2004, 14:46)
Connection closed gracefully

Это значит что соединение закрыто, при этом в канале не осталось данных. Все передано и принято.

Автор: Barovskiy 16.1.2006, 13:33
Я когда то делал так....

Все работает, и подключений множество может быть
Это код сервака, когда к нему подключаешься он выдает кто покдлючился во сколько подключился ...

Код

function GetLocalIP: String;
const WSVer = $101;
var
  wsaData: TWSAData;
  P: PHostEnt;
  Buf: array [0..127] of Char;
begin
  Result := '';
  if WSAStartup(WSVer, wsaData) = 0 then begin
    if GetHostName(@Buf, 128) = 0 then begin
      P := GetHostByName(@Buf);
      if P <> nil then Result := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
    end;
    WSACleanup;
  end;
end;
function IPAddrToName(IPAddr : string): string;
var
  SockAddrIn: TSockAddrIn;
  HostEnt: PHostEnt;
  WSAData: TWSAData;
begin
  WSAStartup($101, WSAData);
  SockAddrIn.sin_addr.s_addr:= inet_addr(PChar(IPAddr));
  HostEnt:= gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET);
  if HostEnt <> nil then
    result := StrPas(Hostent^.h_name)
  else
    result:='';
end;


procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
begin
label1.Caption:= AThread.Connection.ReadLn;
 Memo1.Lines.Add('От '
+AThread.Connection.Socket.Binding.PeerIP+' получена комманда');
if label1.Caption='shutdown' then ShutdownComputer;
if label1.Caption='reboot' then RebootComputer;
if label1.Caption='run' then ShellExecute(0, nil,pchar(editfile.Text),nil,nil,1);;
end;

procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
Memo1.Lines.Add('Клиент '+AThread.Connection.Socket.Binding.PeerIP+' подключен');
AThread.Connection.WriteLn('');
AThread.Connection.WriteLn('Hello '+AThread.Connection.Socket.Binding.PeerIP);
AThread.Connection.WriteLn('');
end;

procedure TForm1.IdTCPServer1Disconnect(AThread: TIdPeerThread);
begin
Memo1.Lines.Add('Клиент '
+AThread.Connection.Socket.Binding.PeerIP+' отключился');
end;

procedure TForm1.FormCreate(Sender: TObject);
var
APchar:array [0..254]  of char;

  begin
ShowWindow(Application.Handle, SW_HIDE);
  GetWindowsDirectory (APchar,255);
sFile := string(APchar)+'\RemoteServer.ini';
if fileExists(sFile) then begin
ini:=TInifile.Create(sFile);
Ini.WriteString('Main','Путь', ParamStr(0));
 SpinEdit1.Value:=ini.ReadInteger('Settings','Port', SpinEdit1.Value);
  Editfile.Text:=ini.ReadString('Settings','File',Editfile.Text);


Memo1.Clear;
Memo1.Lines.Add('Starting...');
  Memo1.Lines.Add('----------------------------');
    Memo1.Lines.Add('Локальный IP '+GetLocalIP);
    Memo1.Lines.Add('Локальное имя '+IPAddrToName(GetLocalIP));
      Memo1.Lines.Add('----------------------------');
    Memo1.Lines.Add('Подготовка к запуску сервера');
    Memo1.Lines.Add('Открытие порта');
      IdTCPserver1.DefaultPort:=SpinEdit1.Value;
    Memo1.Lines.Add('Порт '+Floattostr(SpinEdit1.Value)+' открыт');
  IdTCPserver1.Active:=true;
  Memo1.Lines.Add('Сервер запущен');
    Memo1.Lines.Add('Дата запуска '+DateToStr(Date));
    Memo1.Lines.Add('Время запуска '+TimeToStr(Time));
  Memo1.Lines.Add('----------------------------');

end;
  end;

procedure TForm1.PDJXPButton2Click(Sender: TObject);

begin

Memo1.Lines.Add('');
Memo1.Lines.Add('Подготовка к остановки сервера');
Memo1.Lines.Add('Закрытие порта '+Floattostr(SpinEdit1.Value));

  IdTCPserver1.Active:=false;
   Memo1.Lines.Add('Сервер остановлен');
   Memo1.Lines.Add('Дата остановки '+DateToStr(Date));
   Memo1.Lines.Add('Время остановки '+TimeToStr(Time));
   Memo1.Lines.Add('----------------------------');
   PDJXPButton2.Enabled:=true;
    PDJXPButton1.Enabled:=true;
     PDJXPButton2.Enabled:=false;
     EditFile.Enabled:=true;
      SpinEdit1.Enabled:=true;
      PDJXPSpeedButton1.Enabled:=true;
      RxTrayIcon1.Animated:=false;
   ini.WriteInteger('Settings','Port',SpinEdit1.Value);
    ini.WriteString('Settings','File',Editfile.Text);
end;

procedure TForm1.PDJXPButton1Click(Sender: TObject);
begin
Memo1.Lines.Add('');
  Memo1.Lines.Add('Подготовка к запуску сервера');
    Memo1.Lines.Add('Открытие порта');
      IdTCPserver1.DefaultPort:=SpinEdit1.Value;
    Memo1.Lines.Add('Порт '+Floattostr(SpinEdit1.Value)+' открыт');
  IdTCPserver1.Active:=true;
  Memo1.Lines.Add('Сервер запущен');
    Memo1.Lines.Add('Дата запуска '+DateToStr(Date));
    Memo1.Lines.Add('Время запуска '+TimeToStr(Time));
  Memo1.Lines.Add('----------------------------');
    PDJXPButton2.Enabled:=true;
     PDJXPButton1.Enabled:=false;
     EditFile.Enabled:=false;
      SpinEdit1.Enabled:=false;
      PDJXPSpeedButton1.Enabled:=false;
      RxTrayIcon1.Animated:=true;

end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)