Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

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

 
Vigi ©   (2010-04-02 22:09) [0]

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

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

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


 
Anatoly Podgoretsky ©   (2010-04-02 22:14) [1]

А спустя некоторое время, сведится что готов, а он уже давно висит.


 
Palladin ©   (2010-04-03 10:18) [2]

Написал аж две серверных части и до сих пор не знаешь, что проверить доступность сервера можно попытавшись к нему подключиться?


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

Что именно? Все что написано или "двайной клик"?


 
Вэн ©   (2010-04-03 12:38) [3]

Удалено модератором
Примечание: Обсуждение модерирования


 
Vigi ©   (2010-04-03 13:59) [4]


> Написал аж две серверных части и до сих пор не знаешь, что
> проверить доступность сервера можно попытавшись к нему подключиться?

> > подскажите как реализовать плиз!!!Что именно? Все что
> написано или "двайной клик"?


Нужно реализовать, что я описал выше ... особенно интерес: помещение информации о сервере(рах) в listview
ну и конечно использования по клику строки в в этом компаненте!
просто с Listview раньше не работал ....

а если быть конкретным то допустим сервера работают ( серверов может быть как 1 .. 100 ) на ip 90.122.11.222 соответственно порты от 1300..1400

а порты серверов могут


 
DVM ©   (2010-04-03 14:43) [5]


> Vigi ©   (03.04.10 13:59) [4]

Ну и в чем проблема. Для реализации того что ты хочешь есть 2 способа:

1) Одним клиентом пытаемся подключаться к серверам последовательно меняя порт клиента. Недостатки - медленно, достоинства - малай расход памяти независимо от количества серверов.

2) Делаем динамически массив (список) клиентов, каждый со своим портом и каждый коннектистся к своему серверу. Недостатки - нужно больше памяти пропорционально числу клиентов, достоинства - более высока якорость.


 
Сергей М. ©   (2010-04-03 19:55) [6]


> а порты серверов могут


Что они "могут" ?


 
DVM ©   (2010-04-03 20:14) [7]


> Сергей М. ©   (03.04.10 19:55) [6]


> > а порты серверов могут
>
>
> Что они "могут" ?

К нему ворвалась разъяренная толпа админов тех серверов. :) Дописать он не успел.


 
Vigi ©   (2010-04-03 20:45) [8]


> > а порты серверов могутЧто они "могут" ?


Да эт ошибся :) на последнюю строчку не обрашаем внимания


 
Vigi ©   (2010-04-03 20:49) [9]


> Ну и в чем проблема. Для реализации того что ты хочешь есть
> 2 способа:1) Одним клиентом пытаемся подключаться к серверам
> последовательно меняя порт клиента. Недостатки - медленно,
>  достоинства - малай расход памяти независимо от количества
> серверов.


Вот это меня устроило бы ... скорость мне тут особо не нужна..


 
Anatoly Podgoretsky ©   (2010-04-03 20:59) [10]

> Vigi  (03.04.2010 20:49:09)  [9]

4 миллиарда адресов, на каждом по 65 тысяч портов.


 
Vigi ©   (2010-04-03 22:21) [11]


> 4 миллиарда адресов, на каждом по 65 тысяч портов.

адрес 1


 
Сергей М. ©   (2010-04-03 23:14) [12]


> адрес 1


А нахрена тогда "2 Серверных части" ?

Достаточно одной, обслуживающей два порта.


 
Anatoly Podgoretsky ©   (2010-04-03 23:22) [13]


> адрес 1

Тогда тебе повезло.


 
Vigi ©   (2010-04-04 05:36) [14]


> А нахрена тогда "2 Серверных части" ?Достаточно одной, обслуживающей
> два порта.


Поверте уважаемый...... надо  в конечном итоге будет 4 или 5 серверных частей которые будут запускаться на одной машине.

ЗЫ: Если дадите пример где одна серверная часть обслуживает два порта тоже буду рад.


 
Anatoly Podgoretsky ©   (2010-04-04 10:51) [15]

Два порта, это как один порт, только два порта. У меня есть программы, которые обслуживают шесть портов.


 
Vigi ©   (2010-04-04 11:58) [16]


> Anatoly Podgoretsky ©   (04.04.10 10:51) [15]
> Два порта, это как один порт, только два порта. У меня есть
> программы, которые обслуживают шесть портов.


а мне от того что есть у тебя легче не становится конкретные примеры где?


 
Vigi ©   (2010-04-04 12:00) [17]

ПРосто уже что то ушли от темы
скажите есть кто может помочь в этом: ????? с конкретными примерами?

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

вот!


 
Anatoly Podgoretsky ©   (2010-04-04 13:28) [18]

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

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


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

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


> Anatoly Podgoretsky

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


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


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

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


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

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

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


 
MsGuns ©   (2010-04-04 20:01) [22]

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


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


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


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

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


 
Anatoly Podgoretsky ©   (2010-04-04 20:43) [24]

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

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


 
Vigi ©   (2010-04-04 20:44) [25]


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


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


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


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


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


 
Anatoly Podgoretsky ©   (2010-04-04 20:50) [27]

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

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


 
Vigi ©   (2010-04-04 21:50) [28]

Вот код:
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 колонку ?


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

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


 
Vigi ©   (2010-04-06 09:46) [30]

Вроде пошло но есть одно но....
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-06 10:06) [31]

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


 
Vigi ©   (2010-04-06 10:21) [32]

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


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

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


 
Vigi ©   (2010-04-06 10:59) [34]

с Сервера поступает текс одна строчка:
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 11:12) [35]


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


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

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


> что не так?


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


 
Vigi ©   (2010-04-06 11:25) [36]

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

Согласен!


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


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


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


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


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



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.053 c
15-1274783792
12
2010-05-25 14:36
2010.08.27
а вот как такое сделали?


15-1265361958
Ghost
2010-02-05 12:25
2010.08.27
Nokia 3110c передача *.txt по синезубу


15-1273264199
Юрий
2010-05-08 00:29
2010.08.27
С днем рождения ! 8 мая 2010 суббота


15-1265559467
Riply
2010-02-07 19:17
2010.08.27
Как расщепляют мгновение


4-1237722427
Delion
2009-03-22 14:47
2010.08.27
Comm Port под Vista AMDx64