Problème de connection TClientSocket (pour expert)
octavianus_1
Messages postés9Date d'inscriptionmardi 22 août 2006StatutMembreDernière intervention 9 juillet 2014
-
23 nov. 2006 à 21:23
octavianus_1
Messages postés9Date d'inscriptionmardi 22 août 2006StatutMembreDernière intervention 9 juillet 2014
-
18 déc. 2006 à 11:38
J'ai une application développée en Delphi7 qui utilise le composant
TClientSocket de Indy9 pour se connecter à un serveur sur lequel tourne
une application "Server" développée en Java. En cas de perte de
connexion avec son serveur courant, l'application "client" doit se
connecter automatiquement à un autre serveur défini dans une liste.
Cela fonctionne parfaitement avec des serveurs Windows. Dans le cas où
l'application "Server" tourne sur un serveur Unix, l'arrêt de
l'application "Server" entraîne un event "onDisconnect" qui démarre la
prise de connexion avec le prochain serveur de la liste (cela peut-être
un serveur Windows ou Unix). Mais là, contrairement à un serveur
Windows, la prise de connexion reste sans réponse: la commande
d'ouverture de la connexion est lancée sans aucun résultat en retour:
pas de connexion, pas d'erreur, pas de timeout...rien.
Il semble que le fait d'arrêter l'application "Server" sur un serveur
Windows ou Unix entraîne un comportement différent du composant
TClientSocket...
Est-ce que ce comportement a déjà été constaté par qqn?
Merci d'avance pour tout avis
A voir également:
Problème de connection TClientSocket (pour expert)
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20123 27 nov. 2006 à 19:17
Après avoir galéré avec les composants Indy 9, et les connexions/deconnexions entre un serveur AS400 et un client Windows, et inversement, je te conseillerais d'utiliser tout simplement un TServerSocket et un TClientSocket (paquet dclsockets70).
Dans mon cas, en utilisant l'événement OnError du TClientSocket, les deconnexions du serveur ( ErrorEvent=eeDisconnect ) étaient alors toutes interceptées.
Cordialement.
<hr />Il existe 10 catégories de personne. Ceux qui connaissent le binaire et les autres...
octavianus_1
Messages postés9Date d'inscriptionmardi 22 août 2006StatutMembreDernière intervention 9 juillet 2014 4 déc. 2006 à 11:46
Merci pour ta réponse WhiteHippo,
En fait, du côté client, j'utilise déjà un composant TClientSocket du
paquet dclsockets70. Par contre, du côté serveur, il s'agit d'une
application dont je n'ai pas le contrôle.
Effectivement, les deconnexions du serveur sont interceptées
efficacement par l'event OnError. Mon problème est ailleurs et se
limite au cas où il y a deconnexion d'un serveur Unix:
1) Sur deconnexion du serveur unix, l'event OnError se déclenche
2) Mon TClientSocket récupère le prochain serveur listé et tente la
connexion (le nouveau serveur peut être du Unix ou du Windows)
3) Et là problème, la connexion ne se fait pas et aucun message
d'erreur d'aucune sorte ne peut être intercepté (ni par un event
OnError, ni par OnDisconnect)
Ce comportement n'arrive jamais avec un serveur Windows, on dirait
que la perte de connexion avec un serveur Unix ne se fait pas
"proprement". J'ai essayé, à la perte de connexion,
de détruire l'objet TClientSocket et d'en créer un nouveau pour la
connexion suivant...Toujours le même comportement...
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20123 9 déc. 2006 à 13:46
Tu travailles en lecture/ecriture synchrone ou asynchrone ? ctBlocking ou ctNonBlocking? Moi j'ai opté pour le ctNonBlocking associé à un timer qui toute les 5 secondes réessayait de se reconnecter. De plus sur une erreur eeDisconnect, fermeture obligatoire de la connexion.
procedure TForm1.ClientSocketError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
if ( ErrorEvent=eeDisconnect ) then
begin
ClientSocket .Close ;
TimerConnexionSocket .Enabled := TRUE ;
end ;
end;
Cordialement.
<hr />
Il existe 10 catégories de personne. Ceux qui connaissent le binaire et les autres...
octavianus_1
Messages postés9Date d'inscriptionmardi 22 août 2006StatutMembreDernière intervention 9 juillet 2014 18 déc. 2006 à 11:38
Je travaille actuellement en asynchrone...Et je ne suis pas loin de
penser que mon problème vient de là (tu lances un essai de connexion et
une erreur peut être retournée plusieurs dizaines de secondes plus
tard, exemple: l'erreur 10060).
Ton idée d'avoir un timer qui essaie périodiquement la connexion est une approche envisageable, je vais essayer.
Autre solution envisageable que je vais certainement explorer lorsque
le reste du développement m'en laissera le temps: du multi-threading
avec un thread spécifique pour le socket fonctionnant en synchrone.