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

Вниз

Пример работы с компонентом XXSocket   Найти похожие ветки 

 
Даддитс   (2007-05-05 15:45) [0]

To Vladimir Kladov: Дайте, пожалуйста, пример работы компонента XXSocket. А то ни XSocket, ни XXSocket нигде не документированы никак, и идут без примеров. И в книге тоже ничего нет.


 
Vladimir Kladov   (2007-05-05 17:50) [1]

Специально я ничего не писал, чтобы для демонстрации. Сразу встраивал в свой код. Уже и не помню деталей. Вытащить могу из своего кода, например, чат. (Неужели какие-то трудности? Мне показалось, что там все достаточно прозрачно, когда делал, никаких принципиальных трудностей не встретил, хотя с сокетами имел первый раз в жизни дело).


 
Даддитс   (2007-05-05 19:55) [2]

Да у меня постоянно ругается на WSAECONNECT, вот и думаю может ошибку где допустил. Пишу простой tcp-клиент.
> Vladimir Kladov   (05.05.07 17:50) [1]
> Вытащить могу из своего кода, например, чат.

было бы здорово, посмотреть некоторые моменты.


 
Vladimir Kladov   (2007-05-05 21:44) [3]

А подробнее можно узнать, что за WSAECONNECT. Кто ругается, сообщение какое.


 
Даддитс   (2007-05-05 23:37) [4]


.....
var
Sock: PClient;
.....

procedure OnSocketError(Dummy: Pointer; Sender: PObj; const Error: Integer);
begin
MessageBox(  GetForegroundWindow, PChar( Err2Str( Error ) ), "", 0);
end;

procedure TForm1.Button1Click(Sender: PObj);
const
CRLF = #13#10;
strRequest =
 "GET /update/data.zip HTTP/1.0" + CRLF +
 "User-Agent: WebUpdater/1.0 (KOL)" + CRLF +
 "Host: localhost";
var
Buf: string;
begin
Sock:= NewClient;
Sock.OnError:= TOnError( MakeMethod(nil, @OnSocketError) );
Sock.Host:= "localhost";
Sock.Port:= 80;
Sock.Connect;
Buf:= strRequest + CRLF + CRLF;
Sock.Send( Buf[1], Length(Buf) );
end;

procedure TForm1.Button2Click(Sender: PObj);
begin
if Assigned(Sock) then
begin
 if Sock.Connected then Sock.DoClose;
 Sock.Free;
end;
end;

примерно так: при щелчке на одну кнопку объект создается, при щелчке на другую соединение закрывается и объект уничтожается.

Назначил специально обработчик OnError, oшибка выскакивает на Sock.Send, по коду ошибки видно, что это WSAENOTSOCK.

Проблем с локальным HTTP-сервером нет, доступен из других программ нормально.


 
Vladimir Kladov   (2007-05-06 15:51) [5]

я через сокет с портом 80 не работал. У меня свой порт был, свой протокол обмена, который я для своих нужд сам и сочинил. Возьмите для работы с http готовые компоненты, у нас же вроде было что-то.


 
D[u]fa ©   (2007-05-06 16:01) [6]

Даддитс  для хттп и подобных протоколов заюзай синапс


 
AndreyRus   (2007-05-06 16:48) [7]


> Даддитс  для хттп и подобных протоколов заюзай синапс


А еще лучше API, ничего сложного там нет.


 
Даддитс   (2007-05-06 17:01) [8]


> Vladimir Kladov   (06.05.07 15:51) [5]
> я через сокет с портом 80 не работал. У меня свой порт был,
>  свой протокол обмена, который я для своих нужд сам и сочинил.

по идее разницы нет, ведь сервер должен принимать соединение и принимать данные, посланные через сокет. Здесь же возникет ошибка сразу, при попытке отправки любых данных на сокет.

>  Возьмите для работы с http готовые компоненты, у нас же
> вроде было что-то.

есть компонент, запрашивающий хтмл-страницу (kolhttp). Он не годится для работы с другими методами (не GET), и позволяет только чистый хтмл получать.


 
Даддитс   (2007-05-06 17:05) [9]


> AndreyRus   (06.05.07 16:48) [7]
>> Даддитс  для хттп и подобных протоколов заюзай синапс
> А еще лучше API, ничего сложного там нет.

по сути, xxsocket - это враппер над АПИ. Можно конечно заюзать АПИ, но хотелось бы разобраться с xxsocket (легкий модуль и базовая функциональность, то что надо). Синапс ведь тяжелее будет, а мне нужны только базовые функции - получить/отправить блок данных через сокет.


 
Даддитс   (2007-05-06 17:10) [10]

To Vladimir Kladov:

> > Vladimir Kladov   (06.05.07 15:51) [5]> я через сокет
> с портом 80 не работал. У меня свой порт был,>  свой протокол
> обмена, который я для своих нужд сам и сочинил.по идее разницы
> нет, ведь сервер должен принимать соединение и принимать
> данные, посланные через сокет. Здесь же возникет ошибка
> сразу, при попытке отправки любых данных на сокет.

Я тут попробовал - эта ошибка выдаетя вообще при попытке коннекта к любому открытому порту, так что проблема не в ХТТП-протоколе. Я сначала думал что проблема в http keepalive. Вообще при попытке отправки данных вылетает WSAECONNECT.


 
Vladimir Kladov   (2007-05-06 20:30) [11]

Правильно, видмимо порт уже захвачен приложением (системой) которое его первое открыло. Так что работать через сокеты с http все равно не получится.


 
Даддитс   (2007-05-06 21:18) [12]


> Vladimir Kladov   (06.05.07 20:30) [11]
> Правильно, видмимо порт уже захвачен приложением (системой)
> которое его первое открыло. Так что работать через сокеты
> с http все равно не получится.

Но ведь я пытаюсь делать клиентский сокет. Или параметр Port для Pclient - это порт, который он сам открывает? %) Я думал это порт, на который он пытается приконнектиться, в случае если он клиент.. (а ведь он клиент). Или xxsocket поволяет только сервера писать? %)


 
GMax   (2007-05-07 23:53) [13]

а WinSock вообще где-то инициализируется ?


 
GMax   (2007-05-08 00:02) [14]

вопрос снимается, посмотрел на xxsockets :)
просто WSAENOTSOCK очень часто именно в этом случае случается.
а WSAECONNECT - это "connection reset by peer", так что может быть это "другая сторона" дурит, файрвол например


 
Даддитс   (2007-05-08 17:50) [15]


> GMax   (08.05.07 00:02) [14]
> вопрос снимается, посмотрел на xxsockets :)просто WSAENOTSOCK
> очень часто именно в этом случае случается.

по идее, если все нормально, WSAENOTSOCK не должен возвращаться.

>а WSAECONNECT
> - это "connection reset by peer", так что может быть это
> "другая сторона" дурит, файрвол например
Все это полностью исключено, тестирую на локалхосте без файрволов, на "Денвере" на базе apache 1.3.33 (win32). Насчет WSAECONNECT (в случае connection reset by peer) я тоже подозревал (см. выше про keepalive), но оказалось что WSAECONNECT выдается и при соединении когда keepalive вообще нет. Я специально проверил.

На мой взгляд, проблемы с самим xxsocket, я примера использования не видел и все чисто по своему разумению делал. Так что мог ошибиться, - код выше есть, - и в таком виде он глючит.

Скорее всего, счас я буду пользовать KOLTCPSocket для своих нужд, хоть он и больше весит и все такое. Сам xxsocket в основном работоспособный, но некоторые куски сырые, как видно выше. У меня нет времени разбираться с очевидными багами, к сожалению. Будет здорово, если какой-нибудь сетевик программер займется xxsocket и доведет его до ума.


 
misha_shar ©   (2007-05-08 18:03) [16]

Компоненты xxSocket правильно сделаны и по моему вполне работоспособны.
Я на них сделал обмен и он работает. Правда у меня были замечания Кладову.
Но они были связаны с работой в UNICODe я их сообщал Владимиру но он на
мое письмо ничего не ответил. Видно не хочет лезть в переферийные программы.
Но и без исправлений там обмен идет нормально. Программы писать очень просто.
Но имей ввиду что обмен ассинхронный и отдавать команду Send пока нет
коннекта нельзя. обмен организуется просто. Запускаешь сервер и задаешь
порт прослушки, но смотри чтобы этот порт был свободен. Запускаешь
клиента задав ему IP адрес сервера и порт прослушки сервера, отдаешь
команду Connect и ждешь когда клиент законнектится и только потом
можно отдавать команды Send. Но имей ввиду что обмен буферизован не
твоей программой и поэтому получать ты можешь или несколько сообщений
сразу или часть одного из них поэтому задай символ конца сообщения
и обрабатывай его наличие. Дерзай! Не связывайся с API.


 
Даддитс   (2007-05-08 19:26) [17]


> misha_shar ©   (08.05.07 18:03) [16]
> Компоненты xxSocket правильно сделаны и по моему вполне
> работоспособны.Я на них сделал обмен и он работает.
Я и не говорю, что они не работоспособны, но их еще надо заставить работать %) Нет примеров и я не разобрался в своей конкретной задаче. Если не сложно, скинь рабочий пример, посмотрю,может что можно сделать для обмена с http-сервером.

> Но и без исправлений там обмен идет нормально. Программы
> писать очень просто.Но имей ввиду что обмен ассинхронный
> и отдавать команду Send пока нетконнекта нельзя. обмен организуется
> просто. Запускаешь сервер и задаешьпорт прослушки, но смотри
> чтобы этот порт был свободен. Запускаешьклиента задав ему
> IP адрес сервера и порт прослушки сервера, отдаешькоманду
> Connect и ждешь когда клиент законнектится и только потомможно
> отдавать команды Send. Но имей ввиду что обмен буферизован
> нетвоей программой и поэтому получать ты можешь или несколько
> сообщенийсразу или часть одного из них поэтому задай символ
> конца сообщенияи обрабатывай его наличие.

Скинь пример, посмотрим. Может сделаю с помощью xxsocket.


 
Vladimir Kladov   (2007-05-08 21:47) [18]

Поправляю: правильно сделан xsocket (респект автору). Правда, там мне кучу багов и ликов пришлось исправить, и я добавил еще один x.


 
misha_shar ©   (2007-05-11 09:25) [19]

Я когда то изучал обмен и написал этот пример. Это клиентская часть. Как я понял она то тебе и нужна.
Клиент может как посылать сообщения так и принимать их. Пример был сделан в МСК и я часть программы
к делу не относящуюся убрал, но суть дела сохранена. Серверную часть я тоже не посылаю. Если она тебе
понадобится то вышлю следующий раз.

   Form: PControl;
 {$ELSE not_KOL_MCK}
 TForm1 = class(TForm)
 {$ENDIF KOL_MCK}
   KOLProject1: TKOLProject;
   KOLForm1: TKOLForm;
   Panel1: TKOLPanel;
   Panel2: TKOLPanel;
   eSnd: TKOLEditBox;
   Panel3: TKOLPanel;
   InBuf: TKOLMemo;
   Toolbar1: TKOLToolbar;
   procedure KOLForm1FormCreate(Sender: PObj);
   procedure Toolbar1TB1Click(Sender: PControl; BtnID: Integer);
   procedure Toolbar1TB2Click(Sender: PControl; BtnID: Integer);
   procedure Toolbar1TB3Click(Sender: PControl; BtnID: Integer);
 private
   { Private declarations }
 procedure ClntCon(Sender: PClient);
 procedure ClntDisc(Sender: PBaseSocket);
 procedure ClntRcv(Sender: PBaseSocket; Buf: PChar; Count: Integer;var NextTimeBufLen: Integer);
 public
   { Public declarations }
 end;

var
 Form1 {$IFDEF KOL_MCK} : PForm1 {$ELSE} : TForm1 {$ENDIF} ;

{$IFDEF KOL_MCK}
procedure NewForm1( var Result: PForm1; AParent: PControl );
{$ENDIF}

implementation

var
 Clnt:PClient;
const cCR : String = KOLString(#13+#10) ;

{$IFNDEF KOL_MCK} {$R *.DFM} {$ENDIF}

{$IFDEF KOL_MCK}
{$I Unit1_1.inc}
{$ENDIF}

procedure TForm1.KOLForm1FormCreate(Sender: PObj);
begin
Clnt:=NewClient;
Form.Add2AutoFree(Clnt);
Clnt.Tag=0;
Clnt.Host:="127.0.0.1"; //IP сервера
Clnt.Port:=1510; //порт сервера
Clnt.OnConnect:=ClntCon;
Clnt.OnDisconnect:=ClntDisc;
Clnt.OnReceive:=ClntRcv;
end;

procedure TForm1.ClntCon(Sender: PClient);
begin
InBuf.Add("Connect "+cCR);
Clnt.Tag=1;
//здесь уже можно передавать сообщения серверу если надо
end;

procedure TForm1.ClntDisc(Sender: PBaseSocket);
begin
Clnt.Tag=0;
InBuf.Add("DisConnect "+cCR);
end;

procedure TForm1.Toolbar1TB1Click(Sender: PControl; BtnID: Integer);
begin
Clnt.Connect;
//здесь нельзя передавать сообщения серверу!!! коннекта еще точно нет
end;

procedure TForm1.Toolbar1TB2Click(Sender: PControl; BtnID: Integer);
begin
Clnt.Disconnect;
end;

procedure TForm1.ClntRcv(Sender: PBaseSocket; Buf:PChar;Count:Integer; var NextTimeBufLen: Integer);
begin
InBuf.Add(Buf);
end;

procedure TForm1.Toolbar1TB3Click(Sender: PControl; BtnID: Integer);
var S : KOLString;
begin
S:=eSnd.Text;
if (S<>"")and(Clnt.Tag=1) then
Clnt.Send(S,Length(S));
end;

end.



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

Форум: "KOL";
Текущий архив: 2007.12.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.04 c
2-1194511180
Ega23
2007-11-08 11:39
2007.12.02
Отловить момент активизации фрейма


15-1193135552
Fregl
2007-10-23 14:32
2007.12.02
Отображение графиков в реальном времени


3-1185611898
pohil
2007-07-28 12:38
2007.12.02
Формат даты


15-1193703706
DimonS
2007-10-30 03:21
2007.12.02
PowerPack 2.47


1-1189590777
em240
2007-09-12 13:52
2007.12.02
Завершение потока





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский