Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Indy TCPServer 
:(
    Опции темы
Ripper
Дата 13.8.2004, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



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


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
Girder
Дата 13.8.2004, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 4
Всего: 155



IdTCPServer1.Threads.LockList.Count


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Петрович
Дата 13.8.2004, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 1
Всего: 55



Если имеется ввиду TIdTCPServer, то у него есть свойство Threads


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Ripper
Дата 13.8.2004, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



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


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
Girder
Дата 13.8.2004, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 4
Всего: 155



Код
...
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 код плиз...

Это сообщение отредактировал(а) Girder - 13.8.2004, 23:25


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Ripper
Дата 14.8.2004, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



Че то проги скомпиленные постоянно виснут... сокеты намного приятнее... хм
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...
потом нажимаю отослать текст и виснет клиент


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
Jey_k
Дата 14.8.2004, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


WEB-командир
****


Профиль
Группа: Комодератор
Сообщений: 4149
Регистрация: 16.11.2003
Где: Москва

Репутация: нет
Всего: 61



Отправил почтой


--------------------
PM MAIL WWW   Вверх
Петрович
Дата 14.8.2004, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 1
Всего: 55



Правильнее делать так, и только так (имеется ввиду использование свойства 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.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Ripper
Дата 14.8.2004, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



незнаю все равно ничего не получается... видимо сервер не посылает текст. Что за ошибка
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;




--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
Петрович
Дата 18.8.2004, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 1
Всего: 55



Цитата(Ripper @ 14.8.2004, 14:46)
Connection closed gracefully

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


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Barovskiy
Дата 16.1.2006, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 15.1.2006

Репутация: нет
Всего: нет



Я когда то делал так....

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

Код

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;


Это сообщение отредактировал(а) Barovskiy - 16.1.2006, 13:36
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0591 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.