[JAVA] Socket UDP et InputStream, probleme de read

Socket UDP et InputStream, probleme de read [JAVA] - Java - Programmation

Marsh Posté le 02-05-2003 à 12:15:29    

Salut,
quelqu'un peut-il me dire pourquoi ce code marche :

Code :
  1. InputStream input = socket.getInputStream();
  2. for ( int i = 0; i < data.length; ++i )
  3. {
  4.     data[ i ] = input.read();
  5. }


et celui-ci non (le read reste bloqué) :

Code :
  1. InputStream input = socket.getInputStream();
  2. input.read( data );
  3. // ou bien input.read( data, 0, data.length );


C'est censé lire exactement la meme quantite de byte émis. Sauf que ca reste bloqué au read. Meme un flush ou un close apres l'émission  sur le OutputStream ne change rien.
Une idée ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 02-05-2003 à 12:15:29   

Reply

Marsh Posté le 02-05-2003 à 18:02:12    

:cry:


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 02-05-2003 à 20:08:48    

que vaut data?


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 05-05-2003 à 10:22:11    

tien ça ça marche au moin... et c propre!

Citation :

  /**
   * class recepteur réseau du chat udp
 * @author TROLAT_REYNIER_2a_isi_2j
 */
   
   import java.io.*;
   import java.net.*;
   import fr.iutvalence.isi2.chat.*;
 
 
    class ChatReceiver extends Thread  
   {
   
      public static String IP;
      public ChatGUI gui;
      public static String PORT;
      public  String pseudo;
   
   
   /*le constructeur*/
       public ChatReceiver(String pseu,ChatGUI g,String ip,String port)
       
      {
         super();
         IP=ip;
         PORT=port;
         gui=g;
         pseudo=pseu;
       
      }
   
   /*le corps du thread
   * suivant le principe décrit en cours
   */
       public void run()
      {
         InetAddress group=null;
       
         try
         {
            group=InetAddress.getByName(IP);
         }
             catch(UnknownHostException e)
            {
               System.out.println("pb host" );  ;
            }
       
         MulticastSocket ms=null;
       
         try
         {
            ms=new MulticastSocket(Integer.parseInt(PORT));
         }
             catch(IOException e)
            {
               System.out.println("pb io" );  
            }
       
       
         try
         {
            ms.joinGroup(group);
         }
             catch(IOException e)
            {
               ;
            }
             
         DatagramPacket p=new DatagramPacket(new byte[100],100);
         gui.display("************ bonjour vous étes sur LE chat **************\n" );
         while(true)
         {
         /*on reçoit le message*/
            try
            {
               ms.receive(p);
            }
                catch(IOException e)
               {
                  ;
               }
            String s="";
             
         /*on le récupère est on le format*/
            try
            {
               s=new String(p.getData(),"UTF-16" );
               s=s.substring(0,p.getLength()/2-1);
            }
                catch(UnsupportedEncodingException e)
               {
                  ;
               }
           
          /*on l'affiche*/
           
            gui.display("reçu : "+s+"\n" );
         
         
            try
            {
               Thread.sleep(2000) ;
            }
                catch(InterruptedException e)
               {
                  ;
               }
         }
      }
   }

Reply

Marsh Posté le 05-05-2003 à 10:23:29    

ici c du multicast mais c encore moin compliqué en unicast!

Reply

Marsh Posté le 18-05-2003 à 15:46:05    

Désolé pour le retard.
Il s'agissait d'un projet, qui est rendu maintenant. Mais j'aimerais bien comprendre.
Pour échanger des chaines de caracteres ca marche tres bien.
Mais pour envoyer un gros paquet de données (data est un byte [], qui vaut plusieurs centaines de Ko, voire plusieurs Mo) ca fouarre.
Voila une partie de la classe TCPConnexion, qui est utilisée par le serveur et le client pour les échanges.
Ca merdouille au niveau de ReceiveBytes( byte [] Data ) (a la fin)

Code :
  1. public class tcpConnexion
  2. {
  3.     // serveur
  4.     tcpConnexion( int Port )
  5.     {
  6.      try
  7.      {
  8.             TcpSrvSocket = new ServerSocket( Port );
  9.             IsServer = true;
  10.             IsConnected = false;
  11.         }
  12.         catch ( BindException e )
  13.         {
  14.          System.err.println( "Erreur : le port " + Port + " est déjà utilisé." );
  15.          System.exit( -1 );
  16.         }
  17.         catch ( IOException e )
  18.         {
  19.          System.err.println( e );
  20.          System.exit( -1 );
  21.     }
  22.     }
  23.     // client
  24.     tcpConnexion( String Host, int Port )
  25.     {
  26.      try
  27.         {
  28.          IsServer = false;
  29.          TcpSocket = new Socket( Host, Port );
  30.          IsConnected = true;
  31.       TcpInput = new BufferedReader( new InputStreamReader( TcpSocket.getInputStream() ) );
  32.       TcpOutput = new PrintWriter( TcpSocket.getOutputStream(), true );
  33.      }
  34.      catch ( UnknownHostException e )
  35.         {
  36.          System.err.println( "Erreur : serveur " + Host + " introuvable." );
  37.          System.exit( -1 );
  38.     }
  39.     catch ( ConnectException e )
  40.     {
  41.          System.err.println( "Erreur : la connexion a échoué sur " + Host + ":" + Port );
  42.          System.exit( -1 );
  43.     }
  44.         catch ( IOException e )
  45.         {
  46.          System.err.println( e );
  47.          System.exit( -1 );
  48.     }
  49.     }
  50.     void Close()
  51.     {
  52.      try
  53.      {
  54.       // pour le serveur, le 1° appel met fin à l'accep précédent
  55.             if ( IsConnected )
  56.             {
  57.              TcpInput.close();
  58.              TcpOutput.close();
  59.              TcpSocket.close();
  60.             }
  61.             // le 2° appel consécutif met fin au serveur
  62.             else if ( IsServer )
  63.             {
  64.              TcpSrvSocket.close();
  65.             }
  66.         }
  67.         catch ( IOException e )
  68.         {
  69.          System.err.println( e );
  70.     }
  71.     }
  72.     // serveur : accepter une connexion
  73.     void Accept()
  74.     {
  75.      if ( IsServer && !IsConnected )
  76.      {
  77.       try
  78.       {
  79.                 TcpSocket = TcpSrvSocket.accept();
  80.           TcpInput = new BufferedReader( new InputStreamReader( TcpSocket.getInputStream() ) );
  81.           TcpOutput = new PrintWriter( TcpSocket.getOutputStream(), true );
  82.           IsConnected = true;
  83.             }
  84.             catch ( IOException e )
  85.             {
  86.              System.err.println( e );
  87.              System.exit( -1 );
  88.          }
  89.      }
  90.     }
  91.     // envoyer un tableau de byte
  92.     boolean SendBytes( byte [] Data )
  93.     {
  94.         if ( IsConnected )
  95.         {
  96.             try
  97.             {
  98.                 OutputStream output = TcpSocket.getOutputStream();
  99.                 output.write( Data );
  100.                 return true;
  101.             }
  102.             catch ( IOException e )
  103.             {
  104.              return false;
  105.          }
  106.         }
  107.         return false;
  108.     }
  109.     // recevoir un tableau de byte
  110.     boolean ReceiveBytes( byte [] Data )
  111.     {
  112.         if ( IsConnected )
  113.         {
  114.          try
  115.          {
  116.              InputStream input = TcpSocket.getInputStream();
  117.                 //ne marche pas ... ???
  118.                 //input.read( Data, 0, Data.length );
  119.                 for ( int i = 0; i < Data.length; ++i )
  120.                 {
  121.                     Data[ i ] = (byte)input.read();
  122.                 }
  123.                 return true;
  124.             }
  125.             catch ( IOException e )
  126.             {
  127.              return false;
  128.          }
  129.         }
  130.         return false;
  131.     }
  132.     // données privées
  133.     private ServerSocket TcpSrvSocket = null;  // socket serveur
  134.     private Socket TcpSocket = null;           // socket client
  135.     private BufferedReader TcpInput = null;
  136.     private PrintWriter TcpOutput = null;
  137.     private boolean IsServer;                  // vrai si on est un serveur
  138.     private boolean IsConnected;               // vrai si on est connecté
  139.                                                // (à un serveur ou un client)
  140. }


Message édité par HelloWorld le 18-05-2003 à 15:48:00

---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Sujets relatifs:

Leave a Replay

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