Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Информация о доступных серверах!


Страницы:   1 2

Vigi ©   (2010-04-02 22:09:00) 

Здравствуйте !!!

1. Delphi 2010
2. Использую TClientSocket и TServerSocket
Хочу реализовать следующие:
Написано 2 Серверных части которые используют один IP но разные порты!
задача:
Нужно сделать так чтобы при запуске клиенской части информация о доступности и готовности к работе серверов высвечивалась в listview (свойтво у ListView ViewStyle:=vsReport) тоесть Listview имеет три колонки (информация от сервера) . После чего если юзер жмет двайным кликом в listview на желаемом серере происходит коннект клиента с этим сервером!!!

подскажите как реализовать плиз!!!


Сергей М.   (2010-04-06 11:32:00) [1]


> Vigi ©   (06.04.10 11:25) [36]


Отладчик тебе на что дан ?


Vigi   (2010-04-06 11:25:00) [2]

Таймер у тебя тикает ? Тикает.
И при каждом тике он толкает в хвост конвейера очередную порцию строковых данных.

Согласен!


> Ну как что ?Очевидно же что 0-го элемента списка в момент
> тика таймера не существует - список попросту пуст)


так пробовал сразу в инспекторе объекта listview создать [0] items а всеравно ошибка :(


Сергей М.   (2010-04-06 11:12:00) [3]


> с Сервера поступает текс одна строчка


Ну где же одна-то ?

Таймер у тебя тикает ? Тикает.
И при каждом тике он толкает в хвост конвейера очередную порцию строковых данных.


> что не так?


Ну как что ?
Очевидно же что 0-го элемента списка в момент тика таймера не существует - список попросту пуст)


Vigi   (2010-04-06 10:59:00) [4]

с Сервера поступает текс одна строчка:
procedure TForm1.Timer4Timer(Sender: TObject);
var
infoserv:string;
i:integer;
begin
infoserv:= comandy+'_'+inttostr(server1.Port)+'_'+ label2.Caption ;

 For i:=0 to Server2.Socket.ActiveConnections-1 do
   begin
   Server2.Socket.Connections[i].SendText('#If'+infoserv);
 end;
end;


далее вот реализация этого же алгоритма но локально

procedure TForm1.Timer1Timer(Sender: TObject);
begin
with ListView1.Items.add  do
begin
 Caption:=('1111');
 SubItems.Add('2222');
 SubItems.Add('3333');
end;
end;

end.


все работает

ну а если вот так:
TForm1.Timer1Timer(Sender: TObject);
begin
with ListView1.Items.[0]  do
begin
 Caption:=('1111');
 SubItems.Add('2222');
 SubItems.Add('3333');
end;
end;


как и в сетевой части происходит ошибка вот я и спрашиваю почему что не так?


Сергей М.   (2010-04-06 10:23:00) [5]

Реализовать алгоритм аккумуляции поступающих фрагментов в единую целую строку.


Vigi   (2010-04-06 10:21:00) [6]

А как разрулить эти грабли?


Сергей М.   (2010-04-06 10:06:00) [7]

Ты не понимаешь самого главного - поточной ("конвейерной") природы протокола TCP.
Функциональный метод ReceiveText необязан возвратить в точности ту же строку, которая была ранее отправлена передающей стороной. Переданная строка может быть прочитана целиком принимающей стороной как за один так и за несколько вызовов ReceiveText. Т.е. принимающая сторона обязана организовать тем или иным образом аккумулирующий механизм, собирающий строку из одного или нескольких последовательно поступающих с выхода "конвейера" фрагментов строки.
А у тебя этого нет и в помине, ибо ты наивно полагаешь, что каждому вызову метода SendText('СТРОКА') на стороне передатчика должен соответствать один-единственный вызов ReceiveText() на стороне приемника, якобы обязанный вернуть не иначе как ожидаемую строку 'СТРОКА'.
Потому и грабли.


Vigi   (2010-04-06 09:46:00) [8]

Вроде пошло но есть одно но....
procedure TForm2.Client0Read(Sender: TObject; Socket: TCustomWinSocket);
var
st1,st2,st3,str:string;
t: TStringList;
begin
str:= Socket.ReceiveText;
t := TStringList.create;
t.text := stringReplace(str, '_', #13#10,[rfReplaceAll]);    /// инфа с первого серва
st1:=t[0];
st2:=t[1];
st3:=t[2];
t.Free;
if copy (str,1,3)='#If' then begin
with ListView1.Items.add  do
begin
Caption:=copy(st1,4);
SubItems.Add(st2);
SubItems.Add(st3);

end;


вот такой вариант проходи (работает) но он при постоянном чтении порта постоянно заносит новую строчку в listview ...
если я делаю так :
with ListView1.Items[0]  do
begin
Caption:=copy(st1,4);
SubItems.Add(st2);
SubItems.Add(st3);
end;

то выдает ошибку если я правильно понял выход индекса за границу :( а мне нужно чтоб было именно так.. как исправить???


Сергей М.   (2010-04-04 21:54:00) [9]

Читать справку про TListItem.Subitems


Vigi   (2010-04-04 21:50:00) [10]

Вот код:
procedure TForm2.Client0Read(Sender: TObject; Socket: TCustomWinSocket);
var
st1,st2,st3,str:string;
t: TStringList;
begin
str:= Socket.ReceiveText;
t := TStringList.create;
t.text := stringReplace(str, '_', #13#10,[rfReplaceAll]);    /// инфа с первого серва
st1:=t[0];
st2:=t[1];
st3:=t[2];
t.Free;
if copy (str,1,3)='#If' then begin
ListView1.Items.Add.Caption    := copy(st1,4);
client0.Active := false;
end;
end;


У меня содержимое st1 вставляется в первую колонку. Подскажите как сделать чтоб st2 шло во 2 и st3 соответственно в 3 колонку ?


Anatoly Podgoretsky   (2010-04-04 20:50:00) [11]

> Сергей М.  (04.04.2010 20:46:26)  [26]

Читаем предыдущие сообщения.


Сергей М.   (2010-04-04 20:46:00) [12]


> вроде заработало


А какие могли быть сомнения в этом ?)


Vigi   (2010-04-04 20:44:00) [13]


> Сергей М. ©   (04.04.10 20:13) [23]
> > пример где одна серверная часть обслуживает два портаДа
> какой тебе пример ?)Создай в одном и том же серверном приложении
> д.южину объектов TServerSocket, назначь каждому из них свой
> номер порта - вот тебе и дюжина отдельных сервисов, предоставляемых
> одним и тем же приложением-сервером)


Ми так и сдлали :) вроде заработало !!!


Anatoly Podgoretsky   (2010-04-04 20:43:00) [14]

> Сергей М.  (04.04.2010 20:13:23)  [23]

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


Сергей М.   (2010-04-04 20:13:00) [15]


> пример где одна серверная часть обслуживает два порта


Да какой тебе пример ?)

Создай в одном и том же серверном приложении д.южину объектов TServerSocket, назначь каждому из них свой номер порта - вот тебе и дюжина отдельных сервисов, предоставляемых одним и тем же приложением-сервером)


MsGuns   (2010-04-04 20:01:00) [16]

Демпингует, сволочь :)


Игорь Шевченко   (2010-04-04 17:31:00) [17]

Плохиш ©   (04.04.10 17:25) [20]

Ты третий ноль намеренно что ли пропускаешь ?


Плохиш   (2010-04-04 17:25:00) [18]


> конкретные примеры где?

Каждый пример - 500 евро предоплата.


Дмитрий С   (2010-04-04 17:11:00) [19]

Сделай обработку на сервере широковещательных (или нет) udp пакетов на определенном порту, где твои серверы будут скидывать информацию о своей готовности.
Но, сдается мне, тебе это не поможет, странного хочешь.


> Anatoly Podgoretsky

Рекорд тебе не побить. Сервер login.icq.com вроде как все порты обрабатывает.


Anatoly Podgoretsky   (2010-04-04 13:28:00) [20]

> Vigi  (04.04.2010 11:58:16)  [16]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо