Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с приложением клиент-сервер [D7, WinXP]


Страницы:   1 2 3

Colonel ©   (2008-09-01 21:17:00) 

Доброго всем времени суток,

подскажите в чем может быть проблема: пытаюсь сделать простое приложение клиент сервер, но не работает.

Вот код сервера:

procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Active := True;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
 Socket: TCustomWinSocket);
var
j : integer;
begin
i := ServerSocket1.Socket.ReceiveText;
For j := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
 if ServerSocket1.Socket.Connections[j].SocketHandle Socket.SocketHandle then
  if i = 'status' then ServerSocket1.Socket.Connections[j].SendText('Ok. Connected. Listenning.');
if i = 'logoff' then MyExitWindows(EWX_LOGOFF or EWX_FORCE);
if i = 'reboot' then MyExitWindows(EWX_REBOOT or EWX_FORCE);
if i = 'force reboot' then MyExitWindows(EWX_FORCEIFHUNG or EWX_FORCE);
if i = 'shutdown' then MyExitWindows(EWX_SHUTDOWN or EWX_FORCE);
if i = 'power off' then MyExitWindows(EWX_POWEROFF or EWX_FORCE);
end;


Вот код клиента:

procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);
begin
sb.SimpleText := 'Ïîäêëþ÷åíèå ïðîèçîøëî óñïåøíî';
e_command.Visible := true;
end;

procedure TForm1.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
 ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
sb.SimpleText := 'Ïðîèçîøëà îøèáêà';
end;

procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
sb.SimpleText := 'Êëèåíò îòêëþ÷åí';
end;

procedure TForm1.ClientSocket1Connecting(Sender: TObject;
 Socket: TCustomWinSocket);
begin
sb.SimpleText := 'Ïîäêëþ÷àþñü ...';
end;

procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
i := Socket.ReceiveText;
sb.SimpleText := i;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
ClientSocket1.Active := false;
ClientSocket1.Close;
Close;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Address := PChar(e_ip.text);
if not ClientSocket1.Active then ClientSocket1.Active := true;
//ClientSocket1.Open;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ClientSocket1.Active := false;
ClientSocket1.close;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText(e_command.text);
sb.SimpleText := 'Äàííûå îòïðàâëåíû';
end;


Соединение происходит нормально, а вот когда посылаю команду, то на стороне клиента выдается такая ошибка: Asynchronous socket error 10053, а на стороне сервера такая: Windows socket error: A request to send or receive data was disallowed because is socket not connected and (when sending on a datagram socket using a sendto call) no adress was supplied (10057), on "API" recv. Как это можно исправить ? В чем проблема ?

Спасибо огромное за помощь.


Slym   (2008-09-03 06:44:00) [41]

ServerSocket1.Socket - cлушающий сокет и его роль только слушать и ацептить соединение в другой сокет который
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
им и следуе пользоваться для чтения/записи

Colonel   (03.09.08 6:05) [13]
не вылетали окошки

procedure TForm1.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);

ErrorCode:=0;-ошибка не вылезет... НО! под отладчиком ты ее всеравно увидишь


Colonel   (2008-09-03 06:05:00) [42]

Огромное Вам человеческое спасибо. Был бы Вам очень признателен, если бы Вы пояснили, почему я так сделал по Вашей подсказке и все заработало ?

И еще вопрос, как мне сделать так, чтобы при возникновении ошибки у меня не вылетали окошки, а ошибка эта отображалась в статус баре ? Как я понимаю, здесь нужно отлавливать исключения, только вот как это сделать ? И какие коды ошибок отлавливать.

Спасибо.


Slym   (2008-09-03 04:47:00) [43]

Colonel   (01.09.08 21:17)
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
j : integer;
begin
i := ServerSocket1.Socket.ReceiveText;

всего навсего убрать жирное :)


Colonel   (2008-09-03 00:44:00) [44]

Странные у Вас вопросы Сергей ... А зачем Вы спите ? А зачем Вы едите ? А зачем Вы вообще живете ? А зачем Вы ходите ? Зачем Вы одеваетесь ? Если образно выражаться, все Вы это сдираете, или же хотите сказать, что Вы сами придумали сон, сами придумываете и выращиваете новые культуры картофеля, пшеницы и пр ... Как говорил один человек, и, я склонен ему верить: если человек умный, то он никогда не будет "опускать" тупого, а наоборот будет помогать ему - чтобы привнести свет в его темную голову. И, вместо того чтобы помочь разобраться, дайть дельный совет - Вы просто задаете глупые вопросы.

> Сергей М. ©   (02.09.08 19:31) [10]
> А зачем вообще что-то сдирать ?


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

> Сергей М. ©   (02.09.08 19:31) [10]
>
> Что мешает творить "с нуля" ?
>


Сергей М.   (2008-09-02 19:31:00) [45]

А зачем вообще что-то сдирать ?

Что мешает творить "с нуля" ?


Colonel   (2008-09-02 19:11:00) [46]

Да, оттуда.

> Slym ©
> Эта логика содрана либо из http://www.delphimaster.ru/cgi-
> bin/forum.pl?id=1219864648&n=4 либо из статьи по которой
> тот топик писался


Colonel   (2008-09-02 19:10:00) [47]

После.

> Button3 тобой нажимается ПОСЛЕ того как отработает метод
> ClientSocket1Connect или ДО ?


Сергей М.   (2008-09-02 13:36:00) [48]


> Slym ©   (02.09.08 13:21) [6]


Ни в коем разе)

Даже наоборот - в "пацанском" рейтинге Автора ты им поднят до высокого звания "чувака", а это дорогого стоит, особенно когда "выше")


Slym   (2008-09-02 13:21:00) [49]

Сергей М. ©   (02.09.08 12:27) [5]
а я подумал что ты меня обидеть пытаешься... мол по какой то причине "падаю" в твоем "рейтинге"


Сергей М.   (2008-09-02 12:27:00) [50]


> Slym ©   (02.09.08 11:50) [4]


> почему я стал ниже?


Ну на момент [19]-го поста, где ты был окрещен "чуваком выше", твой пост, где ты сказал про "у меня все работает" и на который сослался автор, действительно был выше по тексту топика)


Slym   (2008-09-02 11:50:00) [51]

Сергей М. ©   (02.09.08 9:22) [2]
И кстати я не понял почему я стал ниже?


Slym   (2008-09-02 11:49:00) [52]

Сергей М. ©   (02.09.08 9:22) [2]
Вот эта логика мне вообще не понятна.

Эта логика содрана либо из http://www.delphimaster.ru/cgi-bin/forum.pl?id=1219864648&n=4либо из статьи по которой тот топик писался


Сергей М.   (2008-09-02 09:22:00) [53]


> For j := 0 to ServerSocket1.Socket.ActiveConnections - 1
> do
>  if ServerSocket1.Socket.Connections[j].SocketHandle <>
> Socket.SocketHandle then
>   if i = 'status' then ServerSocket1.Socket.Connections[j].
> SendText('Ok. Connected. Listenning.');


Вот эта логика мне вообще не понятна.

Один из активных клиентов спросил у сервера "Покажи мне свой свой статус", а сервер получив запрос начинает рассылать свой статус всем кому угодно, только не тому кто его запросил ..


Сергей М.   (2008-09-02 09:11:00) [54]

Button3 тобой нажимается ПОСЛЕ того как отработает метод ClientSocket1Connect или ДО ?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо