![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TspClient и TspServever [D7, XP]
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 не получится - пропотеть таки придется)