Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» delphi:вопрос по интернету (клиент-серверное взаимодействие)

Автор: sailor
Дата сообщения: 05.12.2003 16:12
Осознанно задаю вопрос здесь, а не в web-прграммировании. Там больше людей специализирующихся по php, perl и т.д. А Дельфи вроде как не так распространён для работы в интернет. А между прочим видел я там в панели инструментов (Delphi5) закладочку "internet". Значится такая штука возможна! Написать клиент-серверное приложение целиком на дельфи. Пишем клиента, пишем сервер.. Как-нибудь заливаем это на сервер (возьмём какого-нибудь хостера с апачем или сами апач поставим, настроим тоже как-нибудь). Отсюда вопрос - как всё это можно реализовать? Какие пути есть? Интересуют простейшие методы

Конкретнее, что мне нужно. Есть на сервере файл с данными (в идеале - база данных). Есть клиент, которому нудно получить результат обработки этих данных. Как это хотелось сделать.. Сделать серверную часть программы, которая ведёт все вычисления, работает с данными. И сделать клиента. Обычные формы, кнопочки. Жмёшь на кнопочку - посылается запрос, приходят результаты обработки. Строится график (к примеру). Можно такое на Дельфи сбацать? Просто даже не знаю как и подступиться. Если у кого был опыт создания подобных приложений - поделитесь парой советов "для чайников"

Хоть ссылочки в инете подкиньте!
Автор: MrZeRo
Дата сообщения: 05.12.2003 17:17
sailor
1. Заходишь на hppp://www.delphiplus.org
2. Идешь в раздел "Документация"
3. Идешь в раздел "Delphi 5"
4. Нахожишь там книжку "Delphi 5 руководство разработчика" Во втором томе есть информация на эту тему.

А также на своем диске X:\Program Files\Borland\DelphiX\Demos\Internet
можно посмотреть примеры

А также справочная система Delphi X.

Удачи!
Автор: sailor
Дата сообщения: 05.12.2003 18:14
MrZeRo

Цитата:
"Документация"

Мне нужно узнать пути (по советам добрых знающих людей при помощи простейших примеров) а потом уже идти по этой дороге. Документации тонны. Чаще всего на нелюбимом нерусском языке... Слишком много времени потрачу и сил. Я бы и рад, но ни тем ни другим сейчас не располагаю к сожалению.
Если бы я не нуждался в помощи, то не воззвал бы к ней.
Автор: Pupsik
Дата сообщения: 06.12.2003 07:39
А примеры в папочке Delphi7\Demos\IntraWeb не устроят отца русской демократии?
Може в Delphi5 есть аналоги...?


Добавлено
Кстати, по личному опыту, разработка Web-приложений на Delphi как-то не очень. На PHP как-то быстрее выходит, да и (ИМХО) полегче для сервера...
Автор: sailor
Дата сообщения: 06.12.2003 09:08
Pupsik

Цитата:
А примеры в папочке Delphi7\Demos\IntraWeb не устроят отца русской демократии?
Може в Delphi5 есть аналоги...?

Примеры - это хорошо конечно. Но это код.. А где слова? Что с ними сделать, как использовать... Буду поглядеть.

Цитата:
Кстати, по личному опыту, разработка Web-приложений на Delphi как-то не очень. На PHP как-то быстрее выходит, да и (ИМХО) полегче для сервера...

Мне нужен дельфёвый клиент (в браузере не так много возможностей) и тем более дельфёвый серверный элемент (чтобы подключать модули и DLL для сложных математических вычислений). А с PHP я знаком не по наслышке... Да, действительно проще. Правда если надо сделать супер-сайт...
Автор: Pupsik
Дата сообщения: 08.12.2003 10:22

Цитата:
Примеры - это хорошо конечно. Но это код.. А где слова? Что с ними сделать, как использовать... Буду поглядеть

Не знаю, где взять слова, искать наверно.
У меня получилось разобраться на одних примерах...

А если у тебя и клент и сервер дельфевые, может и нет смысла затачивать сервер под CGI, а просто воспользоваться сокетами и работать напрямую?
Автор: sailor
Дата сообщения: 08.12.2003 15:50
Pupsik

Цитата:
а просто воспользоваться сокетами и работать напрямую?

Вот это дело! Первый дельный совет, а не RTFM. Только вот я всё равно не знаю что это. Но хотя бы знаю в каком направлении можно начать копать. По-любому, спасибо.
Автор: UncoNNecteD
Дата сообщения: 08.12.2003 20:25
Копать надо начать в направлении разбора полетов на примере чата из стандартных сэмплов Дельфи.
Освоишь передачу данных по сокетам и попрешь дальше в направлении разработки протокола.
Потом припаяешь сессии, потом авторизацию и получишь полноценное общение между сервером и клиентом по TCP/IP.
Удачи тебе на жтом тернистом пути
Попробуй начать - наткнешься на проблему конкретную - спрашивай.
Автор: sailor
Дата сообщения: 08.12.2003 20:52
UncoNNecteD

Цитата:
Удачи тебе на жтом тернистом пути
Попробуй начать - наткнешься на проблему конкретную - спрашивай.

ОК. Спасибо, обязательно спрошу Даже на этой неделе.
Автор: ShIvADeSt
Дата сообщения: 09.12.2003 00:53
sailor
Для начала попробуй пообмениваться сообщениями через ClientSocket ServerSocket. Там благо все понятно. Примерно на этом принципе работают многие трояны . Я сам делал нечто подобное (мне надо было чтобы одна машина удаленно запускала на другой программу. Так там я именно через них все и реализовал. Кстати есть исходники по работе с ними. Если надо пульну.
Автор: sailor
Дата сообщения: 09.12.2003 07:18
ShIvADeSt

Цитата:
Для начала попробуй пообмениваться сообщениями через ClientSocket ServerSocket. Там благо все понятно.

Спасибо, пожалуй с этого и начну. Сегодня же

Цитата:
Кстати есть исходники по работе с ними. Если надо пульну.

Конечно надо! Емыл в ПМ.
Автор: KirillForever
Дата сообщения: 10.12.2003 04:19
http://www.delphimaster.ru/articles/sockets/index.html
клиент
---
http://www.delphimaster.ru/articles/socksrv/index.html
сервер
Автор: sailor
Дата сообщения: 10.12.2003 11:33
KirillForever
О! Спасибо больше... То что нужно, по-моему...
ShIvADeSt

Цитата:
Если надо пульну.

Спасибо, получил..
Автор: KirillForever
Дата сообщения: 10.12.2003 13:29
sailor

Цитата:
Спасибо больше...

Да незачто, я как-то себе искал, писал мини-аську для локалки
Автор: sailor
Дата сообщения: 10.12.2003 18:04
Вроде пока всё просто...
Первый вопрос (может я просто не заметил ответа?
ServerSocket1.Socket.Connections[i].SendText('text')
Где i - номер подключения, как я понял. А откуда его узнать? Этот номер. Т.е. делаю я подобие аськи. К серверу подключаются два клиента. Значит i будет принимать 2 значения. Как узнать who is who?

Добавлено
Т.е. клиент отсылает сообщение, как сделать так, чтобы именно ему был послан ответ?
Автор: Dust
Дата сообщения: 10.12.2003 19:08
sailor
Случай тяжелый...

Берешь большую толстую книжку по:
1. Протокол TCP/IP
2. VCL
3. SQL, two & thre-tired Clien-Server

И начинаешь думать...
Тогда отвалиться большинство вопросов.

А то у тебя сначала


Цитата:
Конкретнее, что мне нужно. Есть на сервере файл с данными (в идеале - база данных). Есть клиент, которому нудно получить результат обработки этих данных. Как это хотелось сделать.


а потом

Цитата:
елаю я подобие аськи



Что как говорят в Одессе - две большие разницы...

А номер соединения - это чепуха. У тебя получиться на лету, когда поймешь, что нужно обрабатывать большинство событий сервера во время коннекта.
Автор: sailor
Дата сообщения: 10.12.2003 19:25
Dust

Цитата:
а потом  
Цитата:елаю я подобие аськи

Дык это только для тренировки!
Dust

Цитата:
берешь большую толстую книжку по:

беру и не одну.

Цитата:
И начинаешь думать...


Цитата:
Случай тяжелый...  


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

Ёлки палки. До чего не люблю такие посты. Ничем помочь не можешь - тогда лучше не пиши. Конечно, если сесть, конкретно во всём разобраться можно и спецом стать по сетевым технологиям... Но, подумай, тогда зачем мне с такими простыми вопросами было бы обращаться на форум?? В следующий раз пожалуйста 10 раз подумай, прежде чем отослать сообщение со словами типа "Тогда отвалиться большинство вопросов." Неужели непонятно, что мне нужно в кратчайшие сроки освоить (по минимуму) чуждую технологию.. И времени в день этому могу посвящать очень мало. Не то что на толстую, на тонкую книгу времени не хватает .



to All
А между тем наваял кое-что.
Но пока странно всё работает. Тестировал у себя на локальной сеточке... Один из вариантов написанных серверов (повторяет вариант из статьи ссылка на которую выше) почему-то замечательно запускается на компе с Вин98, а вот на Вин2000 (Pro) выдаёт:
"Windows socket error: Обычно разрешается одно использование адреса сокета (протокол/сетевой адрес/ порт) (10048), on API "bind". Что это такое?

Добавлено
Dust

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

Имеешь в виду что-то типа:

Цитата:
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);

?
И из Socket можно вытащить нужную инфу? Типа Socket.RemoteAddress будет IP клиента, который сейчас приконнектился в данный момент?.. Я об этом думал.. Но в той же аське не только при коннекте происходят какие-то действия. Впрочем направление мыслей уже понятно... бум думать.
Автор: KirillForever
Дата сообщения: 11.12.2003 00:08
sailor

Цитата:
Windows socket error: Обычно разрешается одно использование адреса сокета (протокол/сетевой адрес/ порт) (10048), on API "bind".

Это делфя глючит, когда скомпилишь, и отдельно екзешник пусканёшь, оно должно исчезнуть... А вообще в том коде гдето лажа, я без исходника с нуля переписывал, всё пучкой вышло....
З.Ы. Всё описанное творилось в винтукее...
Автор: sailor
Дата сообщения: 11.12.2003 06:52
KirillForever

Цитата:
Это делфя глючит, когда скомпилишь, и отдельно екзешник пусканёшь, оно должно исчезнуть...

Именно если отдельно пускаю (у меня дальфи на другом компе вообще) тогда и глючит. В общем всё это странно. Особенно если учесть, что сервер написанный ShIvADeStом работает отлично и на вин2000.


Цитата:
я без исходника с нуля переписывал, всё пучкой вышло....

Делал аналогично... Ладно, разберёмся.

Добавлено
Ок.. разобрался вроде. Всё дело было в номере порта, который я задавал. Сменил его и заработало))

Добавлено
А вот проблема с которой справиться пока не могу. Как передать на сервер и обратно запись (тип - record). Посылка - sendbuf, приём - receivebuf.. Но чтой-то не работает. При приёме - "Acces violation at adress..".
Автор: sailor
Дата сообщения: 11.12.2003 12:53
собственно здесь описание аналогичной проблемы. Правда ответ не помогает...
Автор: KirillForever
Дата сообщения: 11.12.2003 13:28
sailor

Код:
{Прием файла через сокет}
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var l: Integer;
buf: PChar;
src: TFileStream;
begin
{Записываем в l размер полученного блока}
l := Socket.ReceiveLength;
{Заказываем память для буфера}
GetMem(buf,l+1);
{Записываем в буфер полученный блок}
Socket.ReceiveBuf(buf,l);
{Открываем временный файл для записи}
src := TFileStream.Create('myfile.tmp',fmOpenReadWrite);
{Ставим позицию в конец файла}
src.Seek(0,soFromEnd);
{Записываем буфер в файл}
src.WriteBuffer(buf,l);
{Закрываем файл}
src.Free;
{Освобождаем память}
FreeMem(buf);
end;
Автор: sailor
Дата сообщения: 11.12.2003 13:57
KirillForever
Попробовал.. на FreeMem(buf); вылетает с той же ошибкой...
Интересно в чём же дело? Может отсылаю не так?
Автор: Dust
Дата сообщения: 11.12.2003 14:05
Еще очень сильно процесс приема зависит от размера сообщения... Если размер сообщения не влазит в кадр ТЦП то ( обычно это 4Кб) нужно вытягивать все данные НЕ ЗА ОДИН прием...

Еще советую разобраться с ошибками - try-catch еще никто не отменил, потом ты нигде не проверяешь размер полученного сообщения, потом использовать GetMem - FreeMem не рекомендуется - юзай new. delete.

Будут конкретные вопросы - пиши... А не - гдк у меня ошибка... Обычно Идет ответ - в ДНК

К тому же направление я тебе задал, как ты сам сказал - и все получилось... А если бы я тебе разложил все по полочкам - сколько бы экспы потерялось, а если бы дал исходный код - ты бы кроме примера вообще бы ничего не написал...

Вобщем пилите Шура (с)б а времни много не бывает, как и денег, впрочем это совсем уже другая история...

Автор: sailor
Дата сообщения: 11.12.2003 14:16
Dust

Цитата:
а если бы дал исходный код - ты бы кроме примера вообще бы ничего не написал...

Цели бывают разные
1) разобраться в вопросе самостоятельно. Получить "экспу".
2) получить готовый работающий продукт. Любым способом. Не важно как работающий, главное что работающий.
Сейчас у меня вторая цель


Цитата:
Еще очень сильно процесс приема зависит от размера сообщения..

26 байт пока.. хм.

Цитата:
Еще советую разобраться с ошибками

Вот как раз с ними я и хотел бы разобраться! Не понимаю откуда лезут...

Цитата:
Будут конкретные вопросы - пиши... А не - гдк у меня ошибка... Обычно Идет ответ - в ДНК

Куда уж конкретнее) Есть ошибка и всё тут. А откуда мне неведомо.. Если б ещё код сам выдумывал - там бы мог накуролесить..

А вообще, спасибо.

Добавлено
Ок, хоть и извратным методом, но смог принять цепочку байтов. Сделал так:

VAR l,m,i: Integer;
buf: array [1..100] of Char;

begin
l := Socket.ReceiveLength;
m:= Socket.ReceiveBuf(buf[1],l);
for i:=1 to m do
edit2.text:=edit2.text+buf[i];
end;

В результате передаётся какая-то цепочка. Но вот что интересно. Отсылаю я её вот как:

Mes.text:=Edit3.Text;
Mes.who:='sailorr';
ct:=sizeof(Mes);
ClientSocket1.Socket.SendBuf(Mes,ct);

где Mess = record
text:string;
who:string;
end;

В результате на форме сервера (в edit2.text) при отсылке строки "31313" получаю на экране
"31313r$?". Оно и понятно - запись. Но почему прочиталось первое поле, а второе не читается? Конечно же, наверное, нельзя выводить сразу запись. Надо цепочку байтов привести к типу записи (причём такому же). Но как?


Добавлено
прошу простить за ламерские вопросы

Добавлено
Хм.. ладно.. раз такое дело - буду отправлять данные простой строкой
Автор: someone312002
Дата сообщения: 12.12.2003 09:35
Сейлор, тебе правильно сказали про сокеты. Только не забудь, что для серверной части тебе придётся описывать свой "сервер" - промежуточный уровень, который будет разбираться с базой данных сам, то бишь для этого должна быть известна ЧЁТКАЯ структура базы данных (таблицы и т.д.), чёткое представление о том, какие данные и в каком случае запрашиваются (query) и в каком виде ты будешь "выкидывать" ответ. Пример, сокет клиент пишет серверу что-то типа "GetUList 10 to 20 FName" расшифрую (эт от тебя зависит, как ты будешь кодировать запросы) что означает получить список каких-то там пользователей с 10 по 20 признаком и сортировать по имени (не фамилии). Что делает сокет сервер: получает, видет строку, расшифровывает её (берёт аргументы, разделённые в данном случае пробелами), обращается к базе и выдаёт на гора (посылает клиенту) ответ в видет данных.
Твоя задача состоит ещё в том, чтобы сделать как можно меньшим поток пересылаемых данных!!! К примеру, при запуске программы сокет-клиент обращается к сокет-серверу с запросом "проверь изменение данных", где данные - редко изменяемые данные. Их можно хранить и на клиенте.
Вроде, пока всё.

УДАЧИ!!!
Автор: Dust
Дата сообщения: 12.12.2003 16:03
sailor
Если отправляешь структуру, так и принимай структурой.... Иначе у тебя из-за aligment поплзут байтики то...
Автор: sailor
Дата сообщения: 12.12.2003 16:06
Dust

Цитата:
Если отправляешь структуру, так и принимай структурой.... Иначе у тебя из-за aligment поплзут байтики то...

Так не принимается Я бы рад... может всё таки расскажешь как принимать и отсылать структурой .. и чтобы правильно было. Весь инет перерыл... Везде ошибки. Не так принимаю

someone312002
ОК.
Автор: UncoNNecteD
Дата сообщения: 13.12.2003 10:00
Принимать структурой получится только если она фиксированной длины.
Например string[10] а не string в типе record.
Принимаешь в буфер, по адресу переменной структуры @strucvar.

Но все таки лучше написать протокол а не использовать структуры.
Автор: Dust
Дата сообщения: 13.12.2003 11:35
UncoNNecteD
Значит выгребаешь в два шага (при ранее описанном ограничении на длинну)
1. Передаем заголовок сообщения фиксированной длинны: а)служ. инфа б) длинна сообщения;
2. По ранее переданному значению выгребаем все сообщение

struct msg{
int len;
char* msg;
}
Автор: IvHarbor
Дата сообщения: 15.12.2003 15:01
В свое время читал статью в компьютерре про прорграммирование на дельфи для веба. Для начинающего самое то. Нашел ссылки на электронную версию статьи:
http://old.softerra.ru/review/program/17829/page1.html
http://old.softerra.ru/review/program/17849/page1.html

Страницы: 12

Предыдущая тема: TDataModule в консольном приложении DELPHI


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.