Notification d'une application cliente depuis un site ASP

Greg86
Notification d'une application cliente depuis un site ASP

Bonjour,

je me permets de poster ici pour vous demander votre aide sur un projet que je suis en train de développer pour mon stage.

Plantons un peu le décor

L'existant est un site internet de rencontre développé en ASP (http://www.nice-people.eu).
Pour le moment, si un membre visite, vote, ... pour un autre membre, une insertion est faite dans une BD MySQL et un e-mail est envoyé (au membre dont le profil a reçu une interaction) par la page ASP.

Mon travail

Mon projet consiste à développer une application cliente (style messenger) qui permettrait de se connecter au site et serait réduit dans la taskbar.
Le principe serait qu'à chaque intercation avec un membre, le membre ayant recu la visite (vote, message,...) s'il est en ligne n'est pas averti par mail, mais par une notification sur ce petit programme de manière instantanée.

Les débuts

J'ai commencé par créer une application cliente qui contact un web service qui lui interroge la BD.
Première chose, l'architecture vous semble-t-elle correct?
Plus j'avance et plus je me dis qu'il vaudrait mieux que je passe par une architecture client/serveur.

Est-il possible par ASP (pas ASP.NET) de pouvoir contacter ce serveur C# hébergé sur un des serveurs physiques du site? Par quel moyen?

Comment puis-je gérer les ports? Il faudrait que l'application puisse se connecter au serveur par les ports standards, tel que 80 ou autre, qu'il ne soit pas bloqué par un firewall paramétré de manière normal.
J'ai vu sur certains IM qu'ils utilisaient le port 80 ou 443. Si je comprends bien, c'est au cas où un serveur web serait installé sur la machine du client, le port 443 est alors utilisé pour recevoir les données, c'est bien ca?

Comment puis-je mettre en place une architecture fiable sachant qu'il y aura un très grand nombre de connexion et d'intercation client/serveur? (Le site tourne autour des 3000 connectés simultanément pour l'instant).

Je vous remercie d'avance pour toute l'aide que pourrez m'apporter.

Je vous souhaite une bonne journée.

fredericmazue

Quote:
, mais mes questions se rapproche plus de l'architecture niveau réseau, je me permets donc de reposter ici afin de respecter la catégorie.

:?:

Quote:
J'ai commencé par créer une application cliente qui contact un web service qui lui interroge la BD.
Première chose, l'architecture vous semble-t-elle correct?

Oui.

Quote:
Plus j'avance et plus je me dis qu'il vaudrait mieux que je passe par une architecture client/serveur.

Lol. C'en est déjà :)

Quote:
Est-il possible par ASP (pas ASP.NET) de pouvoir contacter ce serveur C# hébergé sur un des serveurs physiques du site? Par quel moyen?

Je ne suis pas sûr de comprendre la question. Tu peux préciser ta question ? ASP est obsolète de toute façon.

Quote:
Comment puis-je gérer les ports? Il faudrait que l'application puisse se connecter au serveur par les ports standards, tel que 80 ou autre, qu'il ne soit pas bloqué par un firewall paramétré de manière normal.
J'ai vu sur certains IM qu'ils utilisaient le port 80 ou 443. Si je comprends bien, c'est au cas où un serveur web serait installé sur la machine du client, le port 443 est alors utilisé pour recevoir les données, c'est bien ca?

Pas du tout. Les ports 80 et 443 (http et https respectivement) sont ouverts côté serveur. Côté http://www.nice-people.eu pour être clair.
Il n'y a pas à avoir de serveur web sur les machines clientes.
Et il me semble que tu devrais acquérir quelques notions de base de programmation réseau. Quand un client se connecte à un serveur http, il le fait sur le port 80 du serveur, mais lui le client, n'utilise pas pour ça le port 80 mais un port pris au hasard entre 1024 et 65535
Je me demande bien ce que tu as vu sur "certains IM" et ce que sont ces "certains IM" :shock: :?:
Greg86

Quote:
Pas du tout. Les ports 80 et 443 (http et https respectivement) sont ouverts côté serveur. Côté http://www.nice-people.eu pour être clair.
Il n'y a pas à avoir de serveur web sur les machines clientes.
Et il me semble que tu devrais acquérir quelques notions de base de programmation réseau. Quand un client se connecte à un serveur http, il le fait sur le port 80 du serveur, mais lui le client, n'utilise pas pour ça le port 80 mais un port pris au hasard entre 1024 et 65535
Je me demande bien ce que tu as vu sur "certains IM" et ce que sont ces "certains IM"

J'avais oublié que 443 était le port HTTPS :oops: ce qui me faisait me poser ces questions... Maintenant c'est plus clair.

Quote:
Je ne suis pas sûr de comprendre la question. Tu peux préciser ta question ? ASP est obsolète de toute façon.

Le problème est que je dois faire avec l'existant. C'est sur que ASP est un peu dépassé, mais je ne peux pas imposer à la société de refaire tout leur site en ASP.NET...

Quote:
Lol. C'en est déjà

Je sais qu'un client qui se connecte à un serveur HTTP se connecte sur le port 80.
C'est d'ailleurs ce qui se passe avec mon web service hébergé sous IIS...

Mais je m'explique un peu mieux (jespère :lol: )

Quand je parlais d'architecture client / serveur, je voulais parler d'un serveur c# autonome tournant sur une machine.

Le problème avec ce qui se passe pour le moment avec le web service, c'est que l'application cliente doit explicitement appeler le web service pour obtenir les informations.
Ce qui au final coutera trop en ressources et accès BD. Pour essayer d'atteindre l'instantanéité, il faut que j'appel mon web service souvent (système de timer) mais si pas de résultat, c'est un accès "pour rien"...

L'idée serait que le client soit averti par un moyen quelconque dès qu'une action est réalisée. Je ne pense pas que ce soit possible avec un web service, si?

J'avais donc pensé à un serveur C# autonome dont le role serait de :
Accepter une connexion depuis un client.
(d'où ma petite confusion avec les ports... car dans ce cas, il me faut connaitre le port sur lequel écoute le serveur c#)
Lorsqu'une action est effectuée sur le site (vote, visite, message,...) ASP prévient le serveur c# (comment?) qu'une action a été effectuée et ce dernier préviens le client
J'atteindrais donc l'instantanéité souhaité...

Comment MSN Messenger fait-il pour afficher une alerte instantanément lors d'une connexion, mail, ... Comment est-il prévenu?

J'espère que c'est un peu plus clair maintenant...

Merci d'avance pour toutes vos informations.

fredericmazue

Quote:
L'idée serait que le client soit averti par un moyen quelconque dès qu'une action est réalisée. Je ne pense pas que ce soit possible avec un web service, si?

Sous réserve que j'ai bien compris, non.

Quote:
(d'où ma petite confusion avec les ports... car dans ce cas, il me faut connaitre le port sur lequel écoute le serveur c#)

Certes. Mais comme c'est toi qui le choisi, le connaitre est facile :D

Quote:
ASP prévient le serveur c# (comment?)

Je n'en sais rien. ASP est vraiment très loin pour moi maintenant. Il y a sans doute moyen d'écrire dans le socket de ton serveur C#, sinon tu écris un petit composant pour le faire et tu l'instancies dans ton code ASP.

Quote:
Comment MSN Messenger fait-il pour afficher une alerte instantanément lors d'une connexion, mail, ... Comment est-il prévenu?

MSN (sur ta machine ) est un client de chat. Le serveur (l'équivalent de ton serveur C#), comme tous les serveurs de chat, conserve un annuaire des connectés. Dans les enregistrements de l'annuaire, il y a au moins l'IP et le port du socket client, et aussi associées toutes infos utiles, par exemple le compte hotmail, ici.
Quand le serveur a une info à transmettre à un client, il écrit dans le socket du client en question, tout simplement.
Greg86

Tout d'abord, un tout grand merci pour tous ces renseignements et pour la rapidité de vos réponses.

Quote:
Certes. Mais comme c'est toi qui le choisi, le connaitre est facile

Pour moi il me semble que non, mais je préfère le demander pour être sûr...

Le fait que le client contact le serveur par TCP sur un port, il ne devrait pas y avoir de problèmes sur le client avec un éventuel pare-feu, étant donné que c'est lui qui se connecte sur une machine distante et que c'est pas lui qui recois une connexion, c'est bien ca?

Deux dernières petites choses... (pour le moment :roll: )

1) Le site tourne actuellement avec une moyenne de 3500 connectés simultanément.
Je suppose qu'un seul serveur C# ne pourra supporter toutes ces connexions, ...
Comment puis-je faire pour que la structure soit robuste?
Sachant que le nombre de connectés simultanés devrait augmenter de façon non négligeable quand le client sera disponible...

Je pensais 1 serveur qui gère les connexions et la charge des autres serveurs et qui selon cette charge redirige sur le serveur le moins occupé.

Ou un seul serveur suffirait-il?

2) Il faut que je garde un style de session sur mon applic cliente (tel que le clic sur le bouton e-mail dans MSN Messenger renvoie directement sur la boite mail)
Comment puis-je faire pour que si l'utilisateur clique sur un profil par exemple, il soit redirigé directement sur son compte utilisateur et la page correspondante?

fredericmazue

Quote:
Pour moi il me semble que non, mais je préfère le demander pour être sûr...

Lol. le serveur c'est toi qui l'écrit. Alors c'est toi qui choisit le port qu'il va écouter.

Quote:
Le fait que le client contact le serveur par TCP sur un port, il ne devrait pas y avoir de problèmes sur le client avec un éventuel pare-feu, étant donné que c'est lui qui se connecte sur une machine distante et que c'est pas lui qui recois une connexion, c'est bien ca?

En gros c'est ça. Disons que sous Windows c'est ça. Au pire Windows va demander à la volée à l'utilisateur du client s'il veut débloquer le port.
Sous Linux ou un autre système, il faudrait peut être que l'utilisateur du client configure le pare-feu.
Mais si j'ai bien compris, tes applis clientes, elles ne tourneront que sur Windows . Alors...
Quote:
Je suppose qu'un seul serveur C# ne pourra supporter toutes ces connexions, ...

Et pourquoi pas ?

Quote:
Je pensais 1 serveur qui gère les connexions et la charge des autres serveurs et qui selon cette charge redirige sur le serveur le moins occupé.

Les grands moyens dis donc... Et bien sûr tout ça tolérant aux pannes, donc pas écrit en C# mais en Erlang.
A moins qu'on ne reste raisonnable :)
Quote:
Comment puis-je faire pour que si l'utilisateur clique sur un profil par exemple, il soit redirigé directement sur son compte utilisateur et la page correspondante?

Oh très simple vraiment: tu écris un peu de code pour qu'il le fasse :)
Greg86

Quote:
Oh très simple vraiment: tu écris un peu de code pour qu'il le fasse

Oui merci merci :wink:

Ca c'est sur que je devrais écrire du code... :roll:

C'est justement le problème... comment puis-je créer une session de type ASP pour que l'utilisateur ne passe pas par la page login mais arrive directement sur la page correspondante?

Greg86

Bonjour,

Je me posais quelques question par rapport à la création de librairie en c#.

J'ai beaucoup moins d'expérience en c# qu'en JAVA.

Pour nos cours, lorsque l'on faisait des serveur JAVA, on avait le client, le serveur, et le protocole.
Un protocole était la définition des requetes - réponses. On mettait tous dans un JAR et on ajoutait le JAR dans le projet du serveur et du client.

Comment puis-je faire de même en c#? En quelques sorte créer l'équivalent du JAR. En créant une DLL, c'est ca?

Merci d'avance.

Greg86

Bonjour,

Voici l'avancement de mon projet.

Je suis donc passé par une architecture client / serveur classique je vais dire.
J'ai donc programmé mon serveur c# en pool de threads qui attend de recevoir des connexions de clients.

Il me reste à implémenter les fonctionnalités et puis la base sera en place.

Il me reste cependant quelques zones d'ombres, parmi celles-ci :

- Comment créer une session reconue par ASP (pas .NET).
J'ai cru apercevoir entre 2 lignes sur un forum qu'il y aurait un objet HTTPWebRequest. Y a-t-il moyen de créer une session grâce à cela?

- La partie communication entre la page ASP et le serveur.
Je pense mettre un thread en attente de réception sur un port, port sur lequel la page ASP pourra envoyer ss notifications.
Est-ce réalisable? Ou y a-t-il une autre solution?

Merci d'avance.