Cześć, mam Delphi 2005.
Czasami mam problemy z połączeniem z serwerem.
Scenariusz połączenia wygląda tak:
Klient łączy się z serwerem(ClientSocket.Connect)
Serwer tworzy dla klienta nowy obiekt, losuje dla niego klucz i odsyła mu ten klucz.
Gdy klient dostaje klucz, wie, że jest połączony z serwerem i może wysyłać kolejne requesty.
Tylko problem polega na tym, że CZASAMI nie ma połączenia z serwerem. Bardzo ciężko jest to debugować, bo może zdarzy się 1 na 100 prób, że połączenia nie dostanie.
Może ktoś z Was miał już taki problem i sobie z nim jakoś poradził?
W kliencie łączę się z serwerem poprzez: ClientSocket.Connect
Następnie na serwerze jest zdarzenie OnAccept:
procedure TMyService.ServerSocketAccept(Sender: TObject;
Socket: TCustomWinSocket);
var
msgParams: TMsgParams;
begin
ConnectedClients.AddClient(Socket.SocketHandle); //tworzę dla niego nowy obiekt
//tworzę dla niego klucz
setLength(msgParams, 1);
msgParams[0].ParamName:='VAL';
msgParams[0].ParamValue:=CreateCryptKey(10);
//ustawiam mu ten klucz w swojej tablicy
ConnectedClients.SetClientKey(Socket.SocketHandle, msgParams[0].ParamValue);
//wysyłam mu ten klucz
Socket.SendText(CreateMsg(MSG_SET_KEY, msgParams));
msgParams:=nil;
end;
Następnie wykonuje się kod w kliencie w OnConnect
procedure TMainForm.ClientSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
var
params: TMsgParams;
msg: string;
msgType: integer;
begin
msg:=ClientSocket.Socket.ReceiveText; //odczytuję wiadomość
if msg<>'' then
begin
ParseMsg(msg, msgType, Params); //parsuję ją sobie odpowiednio
case MsgType of
MSG_SET_KEY: SetKey(Params); //ustawiam klucz i wykonuję inne operacje
end;
Params:=nil;
end;
end;
No i niby wszystko wygląda ok, niby wszystko działa ok, ale co ileś prób nie mogę się połączyć. Wyposażyłem aplikację też w timeout - realizuję to za pomocą komponentu TThreadedTimer - działania chyba nie trzeba tłumaczyć :)
Ale zdaje się, że w momencie, gdy nie chce się połączyć, to timer też nie chodzi.
Jednak aplikacja się nie zawiesza, bo działa przycisk ANULUJ.
Jednak jeśli wtedy zrobię np:
ClientSocket.Diconnect;
ClientSocket.Connect;
to też się nie połączy.