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

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

TspClient и TspServever [D7, XP]


Страницы:   1 2 3 4 5 6 7 8

kostyl_kostyl ©   (2009-08-12 12:38:00) 

Добрый день. Прошу показать пример обмена сообщениями сервера и клиента с помощью этих компонентов. У меня не выходит.
Я пишу:

procedure TForm1.TcpServer1Accept(Sender: TObject;
 ClientSocket: TCustomIpClient);
begin
 TcpServer1.Sendln('Ответ');
end;
//-----
 if TcpClient.Connect then
 begin
   TcpClient.Sendln('Запрос');
   Response := TcpClient.Receiveln;
   ShowMessage(Response);
 end
 else
   ShowMessage('Нет ответа');
 TcpClient.Disconnect;    

В лучшем случае  выдает пустую строку. В худшем зависает на Response := TcpClient.Receiveln;. Помогите разобраться.
Заранее благодарю.


kostyl_kostyl   (2009-08-21 16:39:00) [1]


> "Много букаф, ниасилил"

я думаю дописать продолжение по поводу "Как ограничить пагубное влияние `чужих` методов кодирования на свои", там, наверно, будет еще больше букаф...


Сергей М.   (2009-08-21 14:45:00) [2]


> почитать другую


"Много букаф, ниасилил"
)


kostyl_kostyl   (2009-08-21 14:07:00) [3]


> Ты лучше сюда отпишись - не одному мне любопытно)

Пока что не получается, опыта маловато для такой статьи.
Могу предложить почитать другую http://itdumka.com.ua/index.php?cmd=shownode&node=5


kostyl_kostyl   (2009-08-20 13:25:00) [4]


> Сергей М. ©   (20.08.09 10:44) [151]

спасибо, уже качнул себе.


Сергей М.   (2009-08-20 10:44:00) [5]

http://www.delphimaster.ru/books/978531800453/


kostyl_kostyl   (2009-08-20 10:22:00) [6]

А можете посоветовать хорошую книжку, но не сильно водяную по сетям?


Anatoly Podgoretsky   (2009-08-19 11:55:00) [7]

Без изучения основ ничего хорошего не будет, а с основами уже не важно какие компоненты или АПИ


Сергей М.   (2009-08-19 10:45:00) [8]

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


kostyl_kostyl   (2009-08-19 10:39:00) [9]


> Но тогда Connected = True ни в жисть не дождешься, хотя
> коннект и будет установлен)

Ну я не знаю нюансов работы этих компонентов и не сильно понимаю строки
(rc = SOCKET_ERROR)


Сергей М.   (2009-08-18 12:47:00) [10]


> Ну в цикле коннекты делать


Не только коннекты, но и приемы и передачи.


> надо переопределить ErrorCheck


Можно и не переопределять. Но тогда Connected = True ни в жисть не дождешься, хотя коннект и будет установлен)


kostyl_kostyl   (2009-08-18 10:42:00) [11]

Ну в цикле коннекты делать... Только вот, что надо переопределить ErrorCheck я бы никогда не догадался.


Сергей М.   (2009-08-17 19:48:00) [12]

Почти как ?)


kostyl_kostyl   (2009-08-17 17:56:00) [13]

Спасибо. Ну я почти так хотел сделать


Сергей М.   (2009-08-17 16:48:00) [14]

type
 TTcpClientFriend = class(TTcpClient)
 protected
   function ErrorCheck(rc: Integer): Integer; override;
 end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 Memo.Clear;
end;

var
 ConnError: Boolean;
 ConnErrorCode: Cardinal;
 ResponseString: String;

procedure TForm1.Button6Click(Sender: TObject);
var
 TcpClient: TTcpClientFriend;
begin
 TcpClient := TTcpClientFriend.Create(nil);
 try
   TcpClient.OnError := TcpClientError;
   TcpClient.OnConnect := TcpClientConnect;
   TcpClient.RemoteHost := 'ya.ru';
   TcpClient.RemotePort := '80';
   TcpClient.BlockMode := bmNonBlocking;
   ConnError := False;
   Timer.Interval := 5000;

   Timer.Enabled := True;
   while Timer.Enabled and not (TcpClient.Connected or Application.Terminated or ConnError) do begin
     TcpClient.Connect;
     Application.ProcessMessages;
   end;
   if not TcpClient.Connected then
     Exit;

   Timer.Enabled := True;
   while Timer.Enabled and not (Application.Terminated or ConnError) do begin
     if TcpClient.Sendln('запрос') <> SOCKET_ERROR then
       Break;
     Application.ProcessMessages;
   end;
   if Application.Terminated or ConnError then
     Exit;

   Timer.Enabled := True;
   while Timer.Enabled and not Application.Terminated and (ResponseString = '') do begin
     ResponseString := TcpClient.Receiveln('');
     if ConnError then
       Break;
     Application.ProcessMessages;
   end;
   Memo.Lines.Add(ResponseString);

 finally
   TcpClient.Free;
 end;
end;

procedure TForm1.TcpClientError(Sender: TObject; SocketError: Integer);
begin
 case SocketError of
   WSAEWOULDBLOCK, WSAEALREADY, WSAEINVAL:;
 else
   Timer.Enabled := False;
   ConnErrorCode := SocketError;
   ConnError := True;
 end;
end;

procedure TForm1.TcpClientConnect(Sender: TObject);
begin
 Timer.Enabled := False;
end;

procedure TForm1.TimerTimer(Sender: TObject);
begin
 Timer.Enabled := False;
end;

{ TTcpClientFriend }

function TTcpClientFriend.ErrorCheck(rc: Integer): Integer;
begin
 if (rc = SOCKET_ERROR) and (WSAGetLastError = WSAEISCONN) then
   Result := 0
 else
   Result := inherited ErrorCheck(rc);
end;


Для работы клиента в неблок.режиме проще будет отказаться от TTcpClient в пользу штатного TClientSocket или TCP-клиента в составе ICS.


kostyl_kostyl   (2009-08-17 12:58:00) [15]

Это запрос. Выполняется однажды в одной операции обращения к серверу. Таких операций может быть много.

 ConnectToServer := False;
 WasCanselErrors := False;
 If TcpClient.Connected then
   TcpClient.Disconnect;
 TcpClient.Connect;
 StartTryConnectTime := Now();
 while not ConnectToServer do
 begin
   Application.ProcessMessages;
   if ((Now - StartTryConnectTime) > 0.0005)
   or WasCanselErrors then
   begin
     Result := False; //нет соединения с сервером
     Exit;
   end;
   ConnectToServer := True;
   TcpClient.SendBuf(ServerRequest, 256);
 end;

OnError клиента:
 if (SocketError = WSAEALREADY)
 or (SocketError = WSAEWOULDBLOCK)
 or (SocketError = WSAENOTCONN)
 then //Если нет коннекта
 begin
   ConnectToServer := False;
 end;
 if (SocketError <> WSAEWOULDBLOCK)
 and (SocketError <> WSAEISCONN)  then
 begin
   TTCPClient(Sender).Disconnect;
   WasCanselErrors := True;
 end;


Сергей М.   (2009-08-17 12:49:00) [16]


> Мне все время выдается WSAEWOULDBLOCK


Показывай код..


> Если у клиента режим на блокирующий, то у сервера тоже должен
> быть не блокирующий?


Фиолетово.
Клиентам нет и не должно быть никакого дела до режимов серверных сокетов, равно как и наоборот.


> среадблокинг? Это как будет влиять на взаимодействие с клиентом,
>  который находиться в режиме нотблокинг?


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


kostyl_kostyl   (2009-08-17 12:38:00) [17]

Мне все время выдается WSAEWOULDBLOCK и таймаут заканчивается. Если у клиента режим на блокирующий, то у сервера тоже должен быть не блокирующий? У меня стоит среадблокинг? Это как будет влиять на взаимодействие с клиентом, который находиться в режиме нотблокинг?


Сергей М.   (2009-08-17 12:23:00) [18]


> что мне делать?


Что тебе не понятно ?


kostyl_kostyl   (2009-08-17 12:20:00) [19]

Так что мне делать?


Сергей М.   (2009-08-17 12:16:00) [20]


> не париться с циклами этими


Не париться при bmNonBlocking  не получится - пропотеть таки придется)


Страницы:   1 2 3 4 5 6 7 8

Наверх

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