Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Delphi - проблемы и решения" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Программирование на DELPHI v3-7 Сетевое программирование(Часть 3)
Информационный Канал Subscribe.Ru |
Программирование на DELPHI
Если у вас есть предложения или замечания, прошу писать мне ForDelphi@Narod.ru
В этом выпуске
1)Как законнектиться через Dial-Up
соединение по умолчанию-->
2)Использование компонента TServerSocket.-->
3)Пишем свой ЧАТ-->
4)Search for Craks-->
4)Вопросы -->
5)Ответы -->
Для этого используется следующая функция: (Возвращает True в случае успеха)
Uses Registry, windows;
Function DUNDialDefault(Hide : Boolean) : Boolean;
// Показать или скрыть диалог dial-up
var Reg : TRegistry;
var TempResult : Boolean;
var Name, con : String;
var ASW : Integer;
begin
Reg := TRegistry.Create;
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKey('\RemoteAccess', False) then
begin
TempResult := True;
Name := Reg.ReadString('Default');
end
else begin
tempresult := False;
end;
Reg.Free;
if TempResult = True then
begin
if Hide = True then ASW := SW_HIDE
else ASW := SW_SHOWDEFAULT;
con := 'rnaui.dll,RnaDial ' + Name;
ShellExecute(0, nil, 'rundll32.exe' , PChar
(con), 'C:\windows\', ASW);
end;
Result := tempResult;
end;
В Win2000 и WinXP можно воспользоваться WinInet:
Для этого добавьте WinInet в секцию
uses.
Затем используйте следующую команду:
InternetAutoDial (INTERNET_AUTODIAL_FORCE_ONLINE, handle);
handle = родительское окно
В Delphi документации по многопотоковому TServerSocket налито довольно много воды, и начинающему программисту сложно понять суть дела. Давайте попытаемся пролить немного света на этот раздел хелпа.
Совместимость: Delphi 3.x (или выше)
Вообще-то, создать многопотоковый сервер, который ожидает пришедшие сообщения на сокете довольно просто. В Delphi для этой цели достаточно использовать компонент TServerSocket.
Давайте рассмотрим структуру работы данного компонента:
- Добавляем TServerSocket в Вашу
основную форму.
- Устанавливаем свойство Servertype в stThreadBlocking
- Создаём новый "unit" (показанный ниже) содержащий поток сервера.
Устанавливаем следующий код на OnSocketGetThread
procedure TfrmMain.fSocketGetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
//
Здесь создаём объект TServerThread, который я привожу ниже.
// Новый объект создаётся каждый раз, когда когда установлен канал связи.
SocketThread := TServerThread.Create( FALSE, ClientSocket );
end;
TServerThread - это объект, который я создаю самостоятельно. Объект наследуется от TServerClientThread и содержит код, который обычно читает и пишет данные из/в сокет.
Созданный "unit", содержит следующий код:
unit serverthread;
interface
uses
windows, scktcomp, SysUtils, Classes, Forms;
type
EServerThread = class( Exception );
// serverthread это потомок TServerClientThread
TServerThread = class( TServerClientThread )
private
fSocketStream : TWinSocketStream;
public
procedure ClientExecute; override;
// ClientExecute отменяет
// TServerClientThread.ClientExecute
// и содержит код, который
// выполняется при старте потока
end;
implementation
procedure TServerThread.ClientExecute;
begin
inherited FreeOnTerminate := TRUE;
try
fSocketStream := TWinSocketStream.Create( ClientSocket,
100000 );
// 100000 - это таймаут в миллисекундах.
try
while ( not Terminated ) and ( ClientSocket.Connected ) do
try
// В это место обычно помещается код,
// ожидающий входных данных, читающий из сокета или пишущий в него
// Пример, приведённый ниже, показывает, что можно добавить в данную
// секцию программы.
except on e:exception do
begin
// Если произошла ошибка, то закрываем
сокет и выходим
ClientSocket.Close;
Terminate;
end;
end;
finally
fSocketStream.Free;
end;
except on e:exception do
begin
// Если произошла ошибка, то закрываем
сокет и выходим
ClientSocket.Close;
Terminate;
end;
end;
end;
Когда связь установлена, потоку необходимо ожидать входящих данных(запроса от клиента). Для этого можно использовать следующий код:
if ( not Terminated ) and
( not fSocketStream.WaitForData( 1000000 ) ) then
begin
//
Обработчик таймаута (т.е. если по истечении 1000000 миллисекунд
// от клиента не пришло запроса
end;
// В сокете есть входящие данные!
Для чтения данных, Вам понадобится создать буфер для хранения полученных данных. Обычно буфер - это PByteArray или массив символов. В этом примере я обозвал буфер как fRequest который является массивом символов. Кроме того я ожидаю фиксированное количество байт. Массив имеет постоянный размер REQUESTSIZE.
var
ac, readlen : integer;
begin
FillChar( fRequest, REQUESTSIZE, 0 );
ac := 0;
repeat
readlen := fSocketStream.Read( fRequest[ac],
1024 );
// считываем блоки по 1024 байт, до
тех пор, пока буфер
// не заполнится
ac := ac+readlen;
until ( readlen = 0 ) or ( ac = REQUESTSIZE );
end;
Если readlen равно 0, значит больше нет входящих данных. Функция Чтения завершается через 100000 миллисекунд после запуска в TWinSocketStream.Create(). Если Вы не знаете сколько времени нужно ожидать запроса от клиента, то чем меньше будет таймаут, тем лучше. В большинстве случаев максимальный таймаут не должен превышать 30 секунд.
При посылке ответа, Вы должны знать, в каком режиме работает клиент. Многие клиенты ожидают только один пакет ответа, другие ожидают несколько пакетов. В этом примере, я подразумеваю клиента, который ожидает только один пакет, так что я должен послать мои данные назад в одном блоке:
fSocketStream.WriteBuffer( fRep, fReplySize );
fRep это буфер, содержащий ответ на запрос клиента, и fReplySize - это размер буфера.
На самом деле, чат очень легко написать, но с помощю компонентов TServerSocket и TClientSocket.Хотя, чтобы оградить вас от ошибок при создании чата, рекомендую сразу скачать рабочий исходник от сюда- http://fordelphi.narod.ru/chat1.rar
Приступим.
Для работы этого кода, на форме должно лежать:
TListBox-1шт.с
именем Mes
TButton-4шт. с именами Button1,Button2,Button3 и Button4
TEdit-4шт. C именами Edit1,Edit2,Edit3 и Edit4
TServerSocket-1шт.с именем Server
TClientSocket-1шт.с именем Client
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,wininet, StdCtrls, ScktComp, Psock, NMSTRM;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Client: TClientSocket;
Server: TServerSocket;
Button3: TButton;
Edit2: TEdit;
Label1: TLabel;
Edit3: TEdit;
Label2: TLabel;
Edit4: TEdit;
Label3: TLabel;
mes: TListBox;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
A:integer;
implementation
{$R *.dfm}
procedure TForm1.Button3Click(Sender: TObject);{Код для кнопки активации
сервера}
begin
server.Port:=strtoint(edit2.text);{Порт для прослушивания}
server.Active:=true;{Активация прослушивания порта}
end;
procedure TForm1.Button1Click(Sender: TObject);{Код для кнопки коннекта}
begin
Client.Port:=StrToInt(edit2.Text);{Порт для подключения}
client.Address:=edit3.Text;{IP-адрес}
client.Host:=edit4.Text;{Имя Компа}
client.Active:=true;{Подключение}
A:=0;
ShowMessage('Ура! Подключились!');
end;
procedure TForm1.Button2Click(Sender: TObject);{Код для кнопки отправки сообщения}
begin
client.Socket.SendText(edit1.Text);{Отправка}
mes.items.Strings[a]:=edit1.Text;{Пишем этот текст у себя}
A:=a+1;
edit1.Text:='';
end;
procedure TForm1.ServerClientRead(Sender: TObject;
Socket: TCustomWinSocket);{Эта функция вызывается при получении сообщения}
begin
mes.items.Strings[A]:='>'+socket.ReceiveText;{Записываем}
A:=A+1;
end;
procedure TForm1.Button4Click(Sender: TObject);{Код кнопки очистки ЛистБокса}
begin
mes.Items.Clear;
A:=0;
end;
end.
Надеюсь, этот простенький пример поможет вам в дальнейшем при создании приложений клиент/сервер
Недавно копаясь в нете я нашёл просто самую лучшую и незаминимую в хозяйстве прогу(IMHO). Это поисковик крэков, причём очень удобный-Вы просто вводите название программы и нажимаете на кнопочку, и всех делов.Весит всего 14кб.Всем, кот ещё не обзавёлся данной программой, рекомендую скачать
Напоминаю всем, что свой вопрос вы можите задать по адресу fordelphi@narod.ru с темой VOPROS
Вопрос # 10 от Delivery
Привет Пеопл!!! Хочу сказать что в Делфи 7 Компоненты Fastnet нету,
это компонента из прошлых версий Делфи. В Делфи 7 Появились новые
компоненты для работы с сетевыми протоколами и интернет: "Indy
Clients, Indy Mics, Indy Server,...." и всё остальное связанное с
Indy. Кстати а у меня встречный вопрос:"Как Отображать те компоненты
которые в данных компонентах они есть а на вкладке их нету. К примеру
TIdFTPListItems TFileListView(Если залезть в Component->Configure
palette...->Далее выбрать вкладку System то TFileListView есть а на
вкладке его нету и поэтому у меня не получаеться использовать их???).
А как использовать TIdFTPListItems и где он находиться я не имею
представления да и хелп Хромает???"
Моё Мыло: Mikle_kpi@ukr.net
Моя Аська: 158888038
Вопрос # 11 от rasilki2@mail.kz
У меня такой вопрос, как в Delphi вызвать окно Windows форматирование
дискеты. Спасибо!!!
Вопрос # 12 от Satan Claus
Люди! Помогите!
Как скрыть свое приложение из Диспетчера задач (CTRL+Alt+Del) под XP
если функция RegisterServiceProcess не пашет (Delphi пишет:
"Точка входа в процедуру RegisterServiceProcess не найдена в
библиотеке DLL KERNEL32.DLL")?????
Вопрос # 13 от
hasan
Здравствуйте.
У меня такой вопрос.
Как узнать размер файла находящегося на сервере в интернете, но
естественно не скачивая его предварительно?
Вопрос # 14 от Евгений Р.
Здравстввйте!
Раз уж Вы затронули сетевое программирование и Delphi (в т.ч. сетевое обновление
программ), то логичным будет описать сетевую инсталяцию программ с использованием
BDE. Проверка наличия последнего на компьютере, скачка bdeinst.cab по существующему
адресу (с хорошим хостингом) и инсталяция.
С уважением,
Евгений.
Вопрос # 15 от santa_k
Здравствуйте, дельфисты.
Скажите пожалуйста: как мне экспортировать таблицу Worda сложной
структуры (ячейки разной высоты) в базу данных (например: dbf).
Чтобы потом сделать просмотр этой базы средствами дельфи?
Спасибо.
Вопрос # 16 от Алексей
Всем сдравствуйте. Мне нужна помощь. Каму не лень прошу помочь.
Вот есть такой исходничёк для отправки почты, но я не знаю как сделать чтобы
к этому письму можно было прекрепить файл.
NMSMTP1.Host:= 'smtp.rambler.ru'; {адрес SMTP сервера}
NMSMTP1.Port := 25; {Порт SMTP сервера}
NMSMTP1.Connect; {Подключение к SMTP серверу}
With NMSMTP1 do
begin
Charset := 'windows-1251'; {Кодировка письма}
PostMessage.FromAddress:='xxx'; {Отправитель письма}
PostMessage.ToAddress.Text:='xxx' ; {Получатель письма}
PostMessage.Body.Text:='xxx'; {Текст письма}
SendMail; {Отправляем письмо}
end;
{Проверяем состояние подключения}
if NMSMTP1.Connected then
NMSMTP1.Disconnect {Отключение от сервера}
Вопрос # 17 от SINNER
Кто нибуть знает, как правельно скомпилировать *.res файл EXE-шника с помощью
drcc32. И как из первого EXE-шника
вызвать второй.
Зарание благодарен.
Вопрос # 18 от Кременецкий А.Н(ОАО "МосАвтоСтекло")
Возник интересный вопрос. Требуется пропихнуть TCP-пакет через прокси,
посредством HTTP,SOCKS5. В сети нашел только старый престарый документ
"Туннелирование пакетов" который толком не понял. Если кто знает,
пожалуйста отзовитесь....
Вопрос # 19 от Oleg666
Привет народ! Кто-нибудь знает, как пишуться кряки для программ? Как можно во времы выполнения программы узнать(из другой программы) все переменные и их значения???
Вопрос # 20 от Заргаров Александр
Здраствуйте!
Есть небольшая проблема.. Интересно занимался ли кто-нибудь этим ранее - может
подскажут.
Вообщем, есть какой-то компонент-контейнер (для текста - Memo, RichEdit ..).
Хотелось бы сделать выделение по столбцам, как в Делфи при нажатии Alt+Shift+стрелки.
Пробовал делать с отрисовкой выделения, но что-то не очень симпатично получается
и неудобно.. Ведь в Делфи, Фаре и у Мелкософта сделано как обычное выделение..
Делал ли кто-нибудь такое. Советовали мне компоненты SynEdit, но что-то там
намудрено.. и я так и не увидел желаемого результата. Заранее спасибо.
Вопрос # 21 от Polivanov Nikolay Sergeevich
Привет! Как на Delphi узнать(вычислить, определить) скорость связи с удаленным
сервером(Желательно используя WinSock)?
С уважением p_kolya.
Вопрос # 22 от Юрий Васильев
Подскажите, please, как скрыть приложение на панели задач и упрятать
значок в трэй? Спасибо заранее.
С уважением, NoN
Вопрос # 23 от Сергей.@rambler.ru
Подскажите чайнику как можно написать маденький сканер для сети.
НО желательно чтобы он мало весил и ел мало памяти.
За ранее блогодарен.
Ответ прошу прислать на Email: Whitespider@rambler.ru
Вопрос #5 от GLUK Короче у меня такой вопрос. У кого недь есть компонент который
в хинты |
Отвечает GLUK Такая чтука есть всё таки вот линька |
Отвечает dig-vam Jedi Code Library: File List on SourceForge: |
Отвечает Nikolay У меня есть компонент могу скинуть, где брал не помню |
Отвечает Хобbeat Все необходимые тебя компоненты можешь искать на
www.torry.net. Хобbeat |
Вопрос #6 от LEONID Доброго дня и ночи! Может быть я чего-то не понимаю, но у меня в стандартно |
Отвечает Angel(Admin) В Delphi7 FastNet'a нету, т.к он полностью заменён закладкой Indy, но его можно вытащить из дистрибутива Delphi6.Хотя мне больше нравится Delphi6. (ИМХО) |
Отвечает GLUK Слушай! А ты возми и установи ещё и пятую delphi и всё будет клёво... |
Отвечает Art4 Здравствуйте! |
Отвечает corel86 Кстати, у меня тоже нет:)) |
Отвечает MihaSoft В Delphi 7 FASTNet нет! только в Delhi 6. |
Отвечает rasilki2@mail.kz Эта вкладка существует в Delphi 5, а в 7 ее нет. |
Отвечает Хобbeat Библиотека FastNet в D7 не поддерживается. Т.к. ее полностью заменяет Хобbeat |
Вопрос #7 от CALEAN Доброго Вам времени суток! Пишет вам Николай! В начале |
Отвечает Dmitriy Belyaev Я и сам пробовал использовать компонент TChart, разобрался, но работает |
Отвечает KseKo Компонент Chart представляет поле, на котором строятся графики и Пример построения графиков синуса и косинуса. Закладка series Procedure TForm1.FormCreate(Sender: TObject); Значения, которые должны отображаться на графиках, заносятся в серии |
Вопрос #8 от FAz Hello :) |
Отвечает GLUK Ваааще в принцепе, виндовс это операционная система! Подключение идёт |
Вопрос #9 от oleg666 Приветик, подскажите пожалуйста, как integer отобразить в string'е |
Отвечает IntFace Ну так есть две функции IntToStr и StrToInt короче их надо юзить!!!!! В хелпе параметры посмотри, функции не API. |
Отвечает kvi@nz.nk.nornik.ru Есть функция такая inttostr Например Label1.caption:=inttostr(Edit1.text); |
Отвечает GLUK А ну вроде как везде var |
Отвечает Антон IntToStr |
Отвечает Angel(Admin) Для этого тебе нужна функция IntToStr(int:integer):string;, а вот если надо наоборот, тогда юзай эту- StrToInt(Str:string):integer; Эти функйии находятся в модуле SysUtils(его необходимо подключить в раздел uses) |
Отвечает santi@tut.by IntToStr(число_или_переменная); |
Отвечает slim Привет, если ты имеешь ввиду преобразование типов, то используй |
Отвечает rasilki2@mail.kz inttostr(a:integer)- из Integer в String |
Отвечает Dmitriy Belyaev Все предельно просто var S : String; GiBi |
Отвечает corel86 Из этого вопроса я делаю вывод, что еще совсем зеленый чайник:))) |
Отвечает Хобbeat function inttostr(in: integer): string; Хобbeat |
С уважением, Angel(http://www.fordelphi.narod.ru)
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||