![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Информация о доступных серверах!
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]
Код давай, а сам не можешь догадаться, как в программе иметь более одного порта.
Смешно даже. Короче у тебя программа неправильно написана.