Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.064 c
15-1268762686
TStas
2010-03-16 21:04
2010.08.27
Как заставить подпрограмму считать быстрее


3-1240340701
VoznikVopros
2009-04-21 23:05
2010.08.27
Как произвести "выделение" в DBLookupListBox1 согласно № эл. в БД


4-1237105273
Дмитрий
2009-03-15 11:21
2010.08.27
Класс диалогового окна


15-1270735483
Andy BitOff
2010-04-08 18:04
2010.08.27
Лицензионная Windows станет бесплатной


2-1267556430
AntonioBanderas
2010-03-02 22:00
2010.08.27
Доступ к данным БД Oracle





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский