[ C# ASP.net] Sockets

Sockets [ C# ASP.net] - Programmation

Marsh Posté le 04-02-2002 à 15:01:41    

Je dois faire un chat en C#/ASP.net
 
Je ne dois rien installer sur le poste utilisateur.
 
Est-ce que je peux utiliser les sockets dans les interfaces faites avec ASP.net ?
 
Est-ce que je dois absolument faire un service web pour intégrer mon interface dans la page web ASP.net ?
 
Est-ce que vous voyez une autre solution ?

Reply

Marsh Posté le 04-02-2002 à 15:01:41   

Reply

Marsh Posté le 04-02-2002 à 17:48:14    

si ça peut t'aider : http://www.aylo.com/AyloChat/  (chat fait en .net)

Reply

Marsh Posté le 05-02-2002 à 09:04:49    

siewn a écrit a écrit :

si ça peut t'aider : http://www.aylo.com/AyloChat/  (chat fait en .net)  




 
C'est exactement ce que je souaite faire. Seulement il n'y a pas les sources. Ils fournissent une dll mais j'ai pas le code qu'il y a derrière.
Enfin, ça me donne un aperçu et je vais essayer de faire pareil!
Merci!

Reply

Marsh Posté le 05-02-2002 à 10:27:21    

En attendant, j'ai commencé à bosser sur les sockets en c# uniquement.
 
J'ai trouvé un code serveur et un code client. J'ai modifié les sources un peu (elles ne marchaient pas, pb de syntaxe et autre).
Maintenant le serveur démarre, le client aussi (le serveur affiche alors que le client s'est connecté mais après.... rien)
Est-ce que c'est normal ou il y a un prob dans le code? Le voici:
 
Pour le serveur

Citation :


using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
 
class Server  
{
   public static void Main()  
   {
      DateTime now;    
      String strDateLine;      
      Encoding ASCII = Encoding.ASCII;
     
      // listen on port 13    
      TcpListener tcpl = new TcpListener(13);    
 
      tcpl.Start();
       
      Console.WriteLine("Waiting for clients to connect" );
         Console.WriteLine("Press Ctrl+c to Quit..." );
 
      while (true)
      {
         // Accept will block until someone connects
                  Socket s = tcpl.AcceptSocket();
         
         // Get the current date and time then concatenate it
                  // into a string
                  now = DateTime.Now;
                  strDateLine = now.ToShortDateString() + " " +  
                  now.ToLongTimeString();
             
                  // Convert the string to a Byte Array & send it
                  Byte[] byteDateLine =  
ASCII.GetBytes(strDateLine.ToCharArray());
         s.Send(byteDateLine, byteDateLine.Length, 0);
         Console.WriteLine("Sent " + strDateLine);
      }
   }
}


 
Pour le client

Citation :


using System;
using System.Net.Sockets;
 
public class Client
{
   static public void Main( string[] Args )
   {
   TcpClient socketForServer;
      try
      {
         socketForServer = new TcpClient("localHost", 13);
      }
      catch
      {
         Console.WriteLine(
            "Failed to connect to server at {0}:999", "localhost" );
         return;
      }
 
      NetworkStream networkStream = socketForServer.GetStream();
 
      System.IO.StreamReader streamReader =
         new System.IO.StreamReader(networkStream);
         
      System.IO.StreamWriter streamWriter =
         new System.IO.StreamWriter(networkStream);
       
      try
      {
         string outputString;
 
         // read the data from the host and display it
     
         {
         
            outputString = streamReader.ReadLine();
 
               Console.WriteLine(outputString);
               streamWriter.WriteLine("Client Message" );
               Console.WriteLine("Client Message" );
               streamWriter.Flush();
               
         }
       
      }
      catch
      {
         Console.WriteLine("Exception reading from Server" );
      }
 
      // tidy up
      networkStream.Close();
   }
}  


 
Votre aide sera la bienvenue ;)

Reply

Marsh Posté le 05-02-2002 à 12:29:29    

Bah, je fais aussi des sockets en ce moment, je regarderais ça ce soir.

Reply

Marsh Posté le 05-02-2002 à 14:20:20    

merci.
En fait le serveur affiche bien qd un client se connecte mais du côté client comment écrire un message et qu'il s'affiche chez les autres clients?

Reply

Marsh Posté le 05-02-2002 à 16:34:06    

ce sont les deux lignes là qui déconnent:
 

Citation :

outputString = streamReader.ReadLine();
Console.WriteLine(outputString);


 
Sans elles (je les ai mis en commentaire), le prog tourne mais du coup on récupère pas le message du serveur qui est l'heure ?

Reply

Marsh Posté le 05-02-2002 à 17:03:25    

shinji a écrit a écrit :

 
 
C'est exactement ce que je souaite faire. Seulement il n'y a pas les sources. Ils fournissent une dll mais j'ai pas le code qu'il y a derrière.
Enfin, ça me donne un aperçu et je vais essayer de faire pareil!
Merci!  




 
avec ça http://www.remotesoft.com/salamander/index.html tu devrais pouvoir décompiler la dll. il parait que ça marche très bien

Reply

Marsh Posté le 05-02-2002 à 17:16:32    

Merci, c'est bon à savoir, ça devrait m'aider.
 
Mais j'aimerais bien comprendre le pkoi du comment dans le source que j'ai mis?

Reply

Marsh Posté le 05-02-2002 à 21:07:11    

Bon, j'ai pas  trop trouvé pourquoi ces lignes ne marchaient pas, mais tu peux les remplacer par ça pour que cela fonctionne:
 
int n;
byte[] b=new byte[256];
do
{
n=networkStream.Read(b,0,b.Length);
}while(n==0);
outputString= new ASCIIEncoding().GetString(b);

Reply

Marsh Posté le 05-02-2002 à 21:07:11   

Reply

Marsh Posté le 05-02-2002 à 22:31:03    

MERCI, j'essaye ça dès demain matin au boulot

Reply

Marsh Posté le 05-02-2002 à 22:41:19    

Sinon dans le principe d'un chat.
 
Sur le serveur :
 
un socket s attend des demandes de connexion.
A chaque demande, un nouveau socket est créé donc un par client.
Le serveur attend que le client lui envoi des messages et dès qu'il en reçoit un, il envoi le contenu du message à toutes les autres sockets ? Je comprends pas bien à quoi servent les threads ? Comment le serveur fait pour écouter les sockets et répondre en même temps ?
 
Le client lui ne fait que lire les messages et les envoyer au serveur via la socket. Mais comment fait-il pour en même temps afficher les messages qu'il reçoit ? Il doit écouter le socket et en plus attendre que l'utilisateur tape un message ?

Reply

Marsh Posté le 06-02-2002 à 09:00:07    

Roswell_ a écrit a écrit :

Bon, j'ai pas  trop trouvé pourquoi ces lignes ne marchaient pas, mais tu peux les remplacer par ça pour que cela fonctionne:
 
int n;
byte[] b=new byte[256];
do
{
n=networkStream.Read(b,0,b.Length);
}while(n==0);
outputString= new ASCIIEncoding().GetString(b);  




 
MERCI bien ROSWELL MERCI MERCI!!!
 
Merci ça ça marche (Il faut pas oublier "using System.Text;" )
C'est bizarre que l'autre méthode marche pas.
Sinon vous auriez pas d'explications sur mes questions posées juste au dessus ?

Reply

Marsh Posté le 06-02-2002 à 10:15:24    

Ben le serveur doit garder la liste de toutes les socket de ses clients qu'il récupere à chaque tcpl.AcceptSocket()
Normalement il faudrait créer un thread par socket avec un mini-protocole pour passer du mode j'écoute/tu écris à l'écrit/tu lis. Mais quand t'as pas mal de socket à gérer, il vaux mieux gérer les connexions en mode asynchrone, qui te mache pas mal le boulot (plus besoin de thread partout).
J'en ai pas encore fait en C# (en rien en fait).
 
Mais tu peux regarder un exemple de client serveur ici:
http://msdn.microsoft.com/library/ [...] xample.asp
http://msdn.microsoft.com/library/ [...] xample.asp
 
A+


---------------
http://www.cheata.net le site qui vous donne la banane!
Reply

Marsh Posté le 06-02-2002 à 10:47:24    

Roswell_ a écrit a écrit :

Ben le serveur doit garder la liste de toutes les socket de ses clients qu'il récupere à chaque tcpl.AcceptSocket()
Normalement il faudrait créer un thread par socket avec un mini-protocole pour passer du mode j'écoute/tu écris à l'écrit/tu lis. Mais quand t'as pas mal de socket à gérer, il vaux mieux gérer les connexions en mode asynchrone, qui te mache pas mal le boulot (plus besoin de thread partout).
J'en ai pas encore fait en C# (en rien en fait).
 
Mais tu peux regarder un exemple de client serveur ici:
http://msdn.microsoft.com/library/ [...] xample.asp
http://msdn.microsoft.com/library/ [...] xample.asp
 
A+  




Merci mais aie aie aie !
 
Je conprends pas tout voir pas grand chose !
Est-ce qu'il y a déjà des Threads dans le bout de prog que j'ai ?
Je crois pas mais avec tout ce que j'ai lu dans mes recherches, je suis un peu confus.
Quant à ce qui est du mode asynchrone, j'arrive pas à suivre!
je trouve pas d'explications à ma hauteur sur google, il y a plein d'exemples mais bon faut les comprendre :(

Reply

Marsh Posté le 06-02-2002 à 10:50:49    

si je comprend bien asynchrone c'est pour éviter de bloquer le serveur, non?
Ok mais bon.....,je continue mes recherches......

Reply

Marsh Posté le 06-02-2002 à 12:55:19    

Bon, t'as pas encore vu les threads en C#, mais tu en as déja fait dans un autre language.
Sinon pour le moment ton premier programme n'en contenait pas, et en  effet c'est pour éviter que l'attente de connexion qui est bloquante, n'empeche d'utiliser l'interface ou le reste du programme. Sans les socket asynchrones, t'aurais du faire un thread qui lance un nouveau thread pour chaque nouvelle socket.


---------------
http://www.cheata.net le site qui vous donne la banane!
Reply

Marsh Posté le 06-02-2002 à 14:40:04    

Merci pour ton aide. Elle m'ai précieuse mais j'ai encore du mal à tout comprendre.
 
ok donc avec mon prog là, le serveur ne peut pas écouter les messages des clients autre que des demande de connexion. Il se contente d'attendre une connexion et de la traiter dès qu'il reçoit une demande.
 
Si je veux qu'il attende une connexion et en même temps qu'il écoute un autre client déjà connecté, je dois faire un thread avec le socket qui écoute pour les connections et un thread par socket des clients pour les messages c'est ça ?
"Un thread pour passer du mode j'écoute/t'écris à j'écris/t'écoute" je comprends pas bien pourquoi, ni comment ?
 
Sauf si je fais en asynchrone. Dans ce cas, comment ça fonctionne ? Pourquoi j'ai plus besoin de threads ?

Reply

Marsh Posté le 06-02-2002 à 14:46:36    

si j'ai bie ncompris le client lui, il se connecte sur un socket et qd c'est fait, je fais une boucle qui attend un message de l'utilisateur et pendant qu'un thread écoute si le serveur a des messages à lui transmettre c'est ça?

Reply

Marsh Posté le 06-02-2002 à 16:31:36    

j'ai créé un nouveau topic plus approprié car c'est des sockets et des threads en général dont je parle, pas uniquement en C# :
 
http://forum.hardware.fr/forum2.ph [...] topic=#bas

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed