Форум: "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