Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.09.2008, 22:45   #1
ToLeG
Пользователь
 
Регистрация: 12.09.2008
Сообщений: 37
По умолчанию IdTCP

Здравствуйте, уважаемые знатоки, помогите пожалуйста! ЗАранее прошу прощения за глупость, неопытный еще...

Есть клиент-серверное приложение вопрос в следующем:

1.
а) Нужно что бы клиент при нажатии кнопки отправлял серверу какую либо строку.
б) Где (в какой процедуре,обработчике) и как отслеживать получение строк от сервера

2.
а) Что бы клиент при получении отправлял ответную строку.
б) Что бы клиент при нажатии кнопки отправлял какую либо строку.

Заранее спасибо!!))
ToLeG вне форума Ответить с цитированием
Старый 13.09.2008, 20:57   #2
Pedro
Форумчанин
 
Аватар для Pedro
 
Регистрация: 25.03.2007
Сообщений: 166
По умолчанию

Вот...
1.
а)
Код:
 procedure TForm3.Button1Click(Sender: TObject);
begin
IdTCPClient1.WriteLn('Hello');
end;
б)
Код:
procedure TForm3.Timer1Timer(Sender: TObject);
var
s:string;
B:Boolean;
begin
  try
    s:=IdTCPClient1.ReadLn();
  except
    B:=true;
  end;
end;
2.
а)
Код:
procedure TForm3.Timer1Timer(Sender: TObject);
var
s:string;
B:Boolean;
begin
  try
    s:=IdTCPClient1.ReadLn();
    if s<>'' then IdTCPClient1.WriteLn('Hello');
  except
    B:=true;
  end;
end;
б) То же что и 1 а)
А вообще это уже обсуждалось, юзай поиск по форуму.
Pedro вне форума Ответить с цитированием
Старый 13.09.2008, 23:00   #3
ToLeG
Пользователь
 
Регистрация: 12.09.2008
Сообщений: 37
По умолчанию

Pedro, спасибо большое, просто я еще совсем не опытный, и у меня пока плохо получается понимать чужой код, а уж темболее переделывать его под себя... НО я постараюсь исправиться)

Когда я задавал вопрос, я немного ошибся, а именно во втором пункте, я хотел спросить следующее:

2.
а) Что бы СЕРВЕР при получении отправлял ответную строку.
б) Что бы СЕРВЕР при нажатии кнопки отправлял какую либо строку.
в) Где (в какой процедуре,обработчике) и как отслеживать получение строк от КЛИЕНТА, кажетчся это обработчик onExecute, если я не ошибаюсь. правильно?

Еще раз заранее спасибо!
ToLeG вне форума Ответить с цитированием
Старый 14.09.2008, 12:48   #4
Pedro
Форумчанин
 
Аватар для Pedro
 
Регистрация: 25.03.2007
Сообщений: 166
По умолчанию

2
а)
Код:
procedure TForm4.IdTCPServer1Execute(AThread: TIdPeerThread);
var
S:string;
begin
S:=AThread.Connection.ReadLn();
if  AThread.Connection.ReadLn()<>' ' then AThread.Connection.WriteLn('hello');
end;
б)
Код:
procedure TForm4.Button1Click(Sender: TObject);
var
list:tlist;
begin
list:=IdTCPServer1.Threads.LockList;
 try
    try
    TIdPeerThread(list.Items[0]).Connection.WriteLn(edit1.Text);
    except
     TIdPeerThread(list.Items[0]).Stop;
    end;
  finally
   IdTCPServer1.Threads.UnlockList;
  end;
end;
в) Правильно - это OnExecute. Отслеживать так:
Код:
S:=AThread.Connection.ReadLn();
S соответсвенно - стринг.
Кстати, забыл сказать, нужно выставить у клиента значение ReadTimeout=1.
Вроде все
Pedro вне форума Ответить с цитированием
Старый 14.09.2008, 23:52   #5
ToLeG
Пользователь
 
Регистрация: 12.09.2008
Сообщений: 37
По умолчанию

О великий Pеdro, ты снова помог мне, СПАСИБО ОГРОМНОЕ!))
Хочу задать еще несколько вопросов, если еще не надоел конечно))

А для чего нужен "ReadTimeout", что он дает и почему присваивается значение именно "1"?

1. Плддерживает ли IdTCTPServer несколько подключений и если да, то сколько.
2. Как отправить строчку определенному клиенту, например подключено к серверу три, а мне нужно отправить строчку только второму...

Заранее спасибо!

Последний раз редактировалось ToLeG; 14.09.2008 в 23:55.
ToLeG вне форума Ответить с цитированием
Старый 15.09.2008, 19:00   #6
Pedro
Форумчанин
 
Аватар для Pedro
 
Регистрация: 25.03.2007
Сообщений: 166
По умолчанию

Тааак... Про ReadTimeout... Ну насколько я понимаю(а мое мнение может быть ошибочным), ReadTimeout - это таймаут чтения. Indy - это блокирующие сокеты, следовательно пока не выполнится действие будет идти таймаут и пользовательский интерфейс будет заморожен. ReadTimeout=1 значит что таймаут будет длиться 1 мск, и после этого времени прозойдет исключение. Пример:
Код:
try
Client.readln();
except
b:=true;//исключение
end;
Вроде так, но повторюсь, я могу ошибаться.

IdTcpServer поддерживает несколько подключений, сколько конкретно я не знаю.
2.
Код:
procedure TForm4.Button1Click(Sender: TObject);
var
list:tlist;
begin
list:=IdTCPServer1.Threads.LockList;
 try
    try
    TIdPeerThread(list.Items[0]).Connection.WriteLn(edit1.Text);
    except
     TIdPeerThread(list.Items[0]).Stop;
    end;
  finally
   IdTCPServer1.Threads.UnlockList;
  end;
end;
Переменная List хранит всех подключенных клиентов, кто подключился первым, тот имеет номер 0, второй - 1 ну и так далее. Значит TIdPeerThread(list.Items[0]).Connection.WriteLn(edit1.Text); - 1му клиенту,
TIdPeerThread(list.Items[1]).Connection.WriteLn(edit1.Text); - 2му клиенту
Pedro вне форума Ответить с цитированием
Старый 15.09.2008, 21:21   #7
ToLeG
Пользователь
 
Регистрация: 12.09.2008
Сообщений: 37
По умолчанию

1. А что должно храниться в перменной list, IP адрес или что то другое?
2. Если в ней хранится IP адрес, то как сервером узнать ip адрес клиента
а) от которого, например только что пришла строчка?
б) или например, который только что подключился (при подключении)

Последний раз редактировалось ToLeG; 16.09.2008 в 08:54.
ToLeG вне форума Ответить с цитированием
Старый 16.09.2008, 19:52   #8
Pedro
Форумчанин
 
Аватар для Pedro
 
Регистрация: 25.03.2007
Сообщений: 166
По умолчанию

При подключении вот так можно узнать IP
Код:
athread.Connection.Socket.Binding.PeerIP
.
А вот на счет переменной лист я точно не знаю.
Pedro вне форума Ответить с цитированием
Старый 16.09.2008, 21:52   #9
ToLeG
Пользователь
 
Регистрация: 12.09.2008
Сообщений: 37
По умолчанию

БОЛЬШОЕ СПАСИБО!!!
ToLeG вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Снова idtcp Pedro Работа с сетью в Delphi 20 01.04.2010 22:37